2011-09-16 15 views
1

2つの2進数(最大31桁)を加算して2進数で出力するプログラムを作成しています。C++バイナリ配列の先行ゼロを削除する

私はすごくうまく動作していますが、解決策の先頭にあるゼロを削除する必要があります。

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はい、私はそれのほとんどを行っています。先のゼロを取り除く方法を理解できません。 – Blake

答えて

2

内部ループ(if(flag))を使用しないでください。それは外側のループの処理を妨げます(i)。

フラグが設定されていると、その時点で文字を出力するだけです。

さらに、ビットの印刷は最初のビットの検出の外にする必要があります。

次の擬似コードは、私はこれに近づくだろう方法を示しています。

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 

コードの最初のブロックは、キャリー付き正確出力番号に変更する必要があるかもしれません。

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

    だけ左端のビットは、キャリーは可能性のいずれかであったことを表示なしで110を出力する:あなたは値2とキャリーになってしまった場合たとえば、あなたはのいずれかをしたいと思います

  • キャリ付き2;または
  • 6運ぶ

せずに最後のブロックは、あなたが何の1ビットがなかったので、それ以外は何も印刷しないだろう値0のためのいくつかの出力を持って保証します。

キャリーと値の間にセパレータを出力する必要があるかどうか(そしてその行をコメントにしたままにする)かキャリーを使用してprintingを最初にtrueにする必要があるかどうかはわかります。 2つのオプションは、それぞれ次のようになります。

if carry is 1: 
    output '1 ' 

と:

if carry is 1: 
    output 1 
    set printing to true 

そして、あなたは大丈夫でなければなりませんコメントにC++への変換を、やった以来。あなたはそれが動作しないと述べているが、私はあなたのコードで入力し、それがうまく働いた、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は++){ IF(C [I] == 1){ 印刷= TRUE。 } if(print) { cout << c [i]; } } – Blake

+0

@Blake、前のコメントに投稿したコードをソースファイルにプラグインして正常に機能しました。アップデートを参照してください。 – paxdiablo

+0

ありがとうございます!私はif(c [i] == '1')に変更する必要がありました。なぜなら、c [32]はcharなので、それは完全に動作するからです! – Blake

0

同じインデックスを2つ使用します。最初のものは== 0の間反復し、2番目のものは最初のものが終了したところから印刷します。

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

おそらく宿題の役に立つ答えではありませんが、美しいC++だからあなたはまだ+1を得る –

関連する問題