3

2進数を10進数に変換する簡単なコードがあります。私のコンパイラでは、分解は1000未満の数でも問題なく機能し、出力は常に同じ1023を超えます。誰かが考えを持っていますか?

#include <stdio.h>
#include <stdlib.h>

// how many power of ten is there in a number 
// (I don't use the pow() function to avoid trouble with floating numbers)
int residu(int N)
{
    int i=0;
    while(N>=1){
        N=N/10;
        i++;
    }
    return i;
}

//exponentiating a number a by a number b
int power(int a, int b){
    int i;
    int res=1;
    for (i=0;i<b;i++){res=a*res;}
    return res;
}

//converting a number N
int main()
{
    int i;

    //the number to convert
    int N;
    scanf("%d",&N);

    //the final decimal result
    int res=0;
    //we decompose N by descending powers of 10, and M is the rest
    int M=0;

    for(i=0;i<residu(N);i++){
        // simple loop to look if there is a power of (residu(N)-1-i) in N, 
        // if yes we increment the binary decomposition by 
        // power(2,residu(N)-1-i)
        if(M+ power(10,residu(N)-1-i) <= N)
        {
            M = M+power(10,residu(N)-1-i);
            res=power(2,residu(N)-1-i)+res;
        }
    }
    printf("%d\n",res);
}
4

5 に答える 5

9

はい、これを試してください:

#include <stdio.h>
int main(void) 
{ 
char bin; int dec = 0;

while (bin != '\n') { 
scanf("%c",&bin); 
if (bin == '1') dec = dec * 2 + 1; 
else if (bin == '0') dec *= 2; } 

printf("%d\n", dec); 

return 0;

}
于 2012-09-09T12:15:13.977 に答える
3

おそらくこれはint、2進数を格納するためにを使用しているためです。Anintは、10桁の長さの2 ^ 31を超える数値を格納しません。また、1023は、10桁の2進数で取得できる最大の数値です。

入力した数値を文字列として読み取ってから、文字列の各文字を処理する方がはるかに簡単です。

于 2012-09-09T11:19:24.100 に答える
1

少し実験した結果、あなたのプログラムは、1と0で構成される数値を基数10の数値(10%d進数を読み取る)としてのみ受け入れることを目的としていると思います。たとえば、入力が与えられると、それは;10を出力します。2与えられた1010、それは出力します10; が与えられる10111001と、それは出力します185

ここまでは順調ですね。残念ながら、与えられた場合、それは1234出力します15が、これは少し予想外です。

が32ビットの符号付き値であるマシンで実行している場合、32ビットの制限(ラウンドで±20億を処理できる)intをオーバーフローするため、10桁を超える数値を入力することはできません。int条項)。このscanf()関数はオーバーフローをうまく処理しません。

入力をエコーすることで自分自身を助けることができます。これは標準のデバッグ手法です。コンピューターが期待する値を取得していることを確認してください。

あなたが完全に間違った方法で問題に取り組んでいると思うので、私はコードを修正しようとはしません。(2進数から10進数、10進数から2進数、または10進数から2進数から10進数として最も適切に記述されているかどうかさえわかりません!)入力を(最大31)文字の文字列として読み取り、検証する方がよいでしょう。それぞれが0または1のいずれかであることが正しいと仮定すると、文字列を非常に簡単に処理しprintf()て、10進数としてフォーマットできる値を生成できます。

于 2012-09-09T11:42:35.443 に答える
0

左シフトは2を掛けるのと同じで、より効率的であるため、よりcに似た答えだと思います。

#include <stdio.h>
#include <stdlib.h>

int bin2int(const char *bin) 
{
    int i, j;
    j = sizeof(int)*8;
    while ( (j--) && ((*bin=='0') || (*bin=='1')) ) {
        i <<= 1;
        if ( *bin=='1' ) i++;
        bin++;
    }
    return i;
}

int main(void) 
{ 
    char* input = NULL;
    size_t size = 0;

    while ( getline(&input, &size, stdin) > 0 ) {
        printf("%i\n", bin2int(input)); 
    }
    free(input);
}
于 2012-09-09T15:56:39.427 に答える
0
#include <stdio.h>  //printf
#include <string.h> //strlen
#include <stdint.h> //uintX_t or use int instead - depend on platform.

/* reverse string */
char *strrev(char *str){
    int end = strlen(str)-1;
    int start = 0;

    while( start<end ){
        str[start] ^= str[end];
        str[end]   ^= str[start];
        str[start] ^= str[end];
        ++start;
        --end;
    }
    return str;
}


/* transform binary string to integer */
uint32_t binstr2int(char *bs){
    uint32_t ret = 0;
    uint32_t val = 1;

    while(*bs){
       if (*bs++ == '1') ret = ret + val;
       val = val*2;
    }
    return ret;
}

int main(void){
    char binstr[] = "1010101001010101110100010011111"; //1428875423
    printf("Binary: %s, Int: %d\n", binstr, binstr2int(strrev(binstr)));
    return 0;
}
于 2013-11-13T13:33:33.293 に答える