2011-09-16 2 views
1

두 개의 이진수 (최대 31 자리수)를 함께 더하고 이진수로 합계를 출력하는 프로그램을 만들고 있습니다.C++ 바이너리 배열의 맨 앞에 오는 0을 제거합니다.

나는 모든 작업이 훌륭하지만 솔루션에서 맨 앞자리에있는 0을 제거해야합니다.

이 내 출력은 무엇인가 :

char c[32]; 
int carry = 0; 
if(carry == '1') 
{ 
    cout << carry; 
} 

for(i = 0; i < 32; i++) 
{ 
    cout << c[i]; 
} 

내가 이것을 시도했지만 작동하지 않았다 :

char c[32]; 
int carry = 0; 
bool flag = false; 

if(carry == '1') 
{ 
    cout << carry; 
} 

for(i=0; i<32; i++) 
{ 
    if(c[i] != 0) 
    { 
     flag = true; 

     if(flag) 
     { 
      for(i = 0; i < 32; i++) 
      { 
       cout << c[i]; 
      } 
     } 
    } 
} 

어떤 아이디어 나 제안을 감상 할 수있다.

편집 : 입력 해 주셔서 감사합니다. 작동하도록했습니다!

+2

학교 숙제를? –

+0

@Pier 예, 대부분의 작업을 완료했습니다. 앞에 0을 제거하는 방법을 알아낼 수 없습니다. – Blake

답변

2

내부 루프가 없어야합니다 (if(flag)). 그것은 외부 루프의 처리를 방해합니다.

그 시점에서 원하는 것은 플래그가 설정된 경우 문자를 출력하는 것입니다.

그리고 그 위에 비트의 인쇄는 첫 번째 비트의 감지 밖에 있어야합니다.

다음 의사 코드

내가이 접근 줄 방법을 보여줍니다 코드의

set printing to false 
if carry is 1: 
    output '1:' 

for each bit position i: 
    if c[i] is 1: 
     set printing to true 
    if printing: 
     output c[i] 

if not printing: 
    output 0 

첫 번째 블록은 캐리와 정확하게 출력 수에 변경해야 할 수 있습니다. 당신이 값 2와 캐리와 함께 결국 예를 들어, 당신이 중 하나를 원하는 것 :

1:10        (or some other separator) 
100000000000000000000000000000010 (33 digits) 

단순히 가장 왼쪽 비트는 것을 표시없이 110을 출력하는 캐리가 될 수 중 하나

  • 캐리가있는 2 개; 나없이
  • 6

마지막 블록은 더 1 비트가 없었다 때문에, 그렇지 않으면 아무것도 인쇄하지 않을 것이다 0 값에 대한 몇 가지 출력을 보장을 실시하고 있습니다.

carry와 value 사이에 구분자를 출력해야하는지 (그리고 해당 행을 주석으로 남겨 두어야하는지) 여부에 관계없이 carry를 사용하여 처음에 printing을 true로 설정해야합니다. 당신이 괜찮을 것 같네요 코멘트에서 C++로의 전환을 완료 한 이후,

if carry is 1: 
    output 1 
    set printing to true 

그리고 :

if carry is 1: 
    output '1 ' 

과 : 두 가지 옵션은 각각 일 것이다.당신은 작동하지 않는 상태,하지만 난 당신의 코드에 입력 그것은 10를 출력 괜찮 았는데 :

#include <iostream> 

int main(void) 
{ 
    int i; 
    int carry = 0; 
    int c[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}; 
    bool print = false; 

    // This is the code you gave in the comment, slightly modified. 
    // vvvvvv 
    if(carry == 1) { 
     std::cout << carry << ":"; 
    } 

    for (i = 0; i < 32; i++) { 
     if (c[i] == 1) { 
      print = true; 
     } 

     if (print) { 
      std::cout << c[i]; 
     } 
    } 
    // ^^^^^^ 

    std::cout << std::endl; 

    return 0; 
} 
+0

? if (carry == '1')이 인쇄되지 않습니다. { cout << carry; }의 (I = 0; I <32; i가 ++) { 경우 (c [I] == 1) { 인쇄 = TRUE; } if (인쇄) { cout << c [i]; } } – Blake

+0

@Blake, 이전 코멘트에 게시 한 코드를 소스 파일에 연결했는데 정상적으로 작동했습니다. 업데이트를 참조하십시오. – paxdiablo

+0

고마워요! 나는 그것을 (c [i] == '1')로 변경해야만했는데 왜냐하면 c [32]가 char이고 그때 완벽하게 작동하기 때문입니다! – Blake

0

동일한 색인에 대해 2 개의 fors를 사용하십시오. 첫번째는 == 0 동안 반복하고, 두번째 것은 처음부터 중단 된 곳부터 인쇄합니다.

1
const char * begin = std::find(c, c+32, '1'); 
size_t len = c - begin + 32; 
std::cout.write(begin, len); 
+0

아마도 숙제에 대한 유용한 대답은 아니지만 아름다운 C++이므로 여전히 +1을 얻습니다. –

관련 문제