2016-03-21 28 views
-1

配列やその他のものを使用せずにループを使用してこのコードを書こうとすると、問題なく動作しますが、その:問題は、それがゼロにexmpため を書き込みませんです: 私は43を入力した場合、それはそれを正しく変換します。101011 が、私は12を入力すると、あなたがしようとした場合、それは唯一の11の代わりに1100Cでの10進数から2進数への変換

int decimal,binr=0; 
int bin=0,rem,i; 
printf("enter the decimal number:"); 
scanf("%d",&decimal); 
for(i=1;decimal!=0;i++){ 

    rem=decimal%2; 
    binr= binr*10 +rem; 
    decimal=decimal/2; 


} 
for(i=0;binr!=0;i++){ 

    rem = binr%10; 
    bin= bin*10 +rem ; 
    binr=binr/10; 

} 
printf("the binary equivalent is: %d",bin); 
+1

、あなたのプログラムをトレースするために、デバッガを使用しましたか? –

答えて

0

アキュムレータが0のときに終了するため、コードが正しく動作しません。代わりに、ビットを数えれば、それらのゼロは無視されません。入力を変数に読み込むと、これは小数点以下には表現されなくなるので、数値が逆転したときにビットを数えて、バイナリに直接進むことができます。

#include <stdio.h> 

int main (void) { 
    unsigned decimal = 12; 
    unsigned reverse = 0; 
    unsigned bits = 0; 
    while(decimal != 0) { 
     reverse = reverse * 2 + decimal % 2; 
     decimal /= 2; 
     bits++; 
    } 
    if(bits == 0) {       // special case 
     printf("0"); 
    } 
    while(bits != 0) { 
     printf("%u", reverse % 2); 
     reverse /= 2; 
     bits--; 
    } 
    printf("\n"); 
    return 0; 
} 

プログラムの出力:

1100 
+0

おかげでこれは助けになりました:)) –

+1

'do {reverse = reverse * 2 + decimal%2; 10進数/ = 2;ビット++; } while(decimal); '特殊な場合を削除します。 – chux

+0

@chux私はそれを逃しました、実際には後の考察として例外に気付きました;( –

0

のを示していますあなたのコードをデバッグするには、それは非常に明確になります。 あなたはB2プログラムにごB10で12を実行した場合、それはこれをするでしょう:

result=0, value=12 
    ret = 12 % 2 -> 0 
    -> result = result * 10 + ret -> 0*10 + 0 
result=0, value=6 
    ret = 6 % 2 -> 0 
    -> result = result * 10 + ret -> 0*10 + 0 
result=0, value=3 
... 

あなたはあなたのプログラムがそれをすることになっているものをやっていない見ることができます。

また、ここではループには使用しないでください。明らかにwhileループです(i変数を使用したことはありませんが、なぜそれが増えていますか?)。

いくつかの調査を行うと、10進/バイナリアルゴリズム実装の実装が多数表示されます。

+0

i変数は、10進数が0になるまでループを継続するためのものです。私は多くの研究を行いましたが、この変換を行う方法はほとんど分かりませんでしたが、ループを使用するだけのコードです。私の唯一の問題は、私が前に言ったようにです。プログラムはゼロを表示していません。 –

関連する問題