1

1 x 2 0 +1 x 2 1 + 1 x 2 2 + 0 x 2 3 +1 x 2 4 = 1 + 2 x (1 + 2 x (1 + 2 x (0 + 2 x 1) ) )

想起b[0] = 1, b[1] = 1, b[2] = 1,b[3] = 0, b[4] = 1

/* to convert a binary representation to a decimal one*/

int dec, b[5] = {1, 1, 1, 0, 1};
dec = b[4];
for (int i = 3; i >= 0; i--)
{
    dec=2 * dec + b[i];  //horner's scheme
}
cout << dec << endl;

このコードを C 言語で書き直してみましたが、正しく動作しません。

#include<stdio.h>

int main()
{
    int B[5];
    int x, s, s1;

    for(int i = 1;i <= 5; i++)
    {
        printf("Enter %d. digit of binary number", i);
        scanf("%d", &B[i]);
    }


    s = B[5];   /*this part for reverse the array*/
    B[5] = B[1];
    B[1] = s;

    s1 = B[4];
    B[4] = B[2];
    B[2] = s1; 

    x = B[4];

    for (int i = 3; i >= 0; i--)
    {
        x = 2 * x + B[i];  
    }

    printf("%d", x);
    scanf("%d");
}
4

2 に答える 2

2

これは、配列 B を初期化する最初のループです。

    int B[5];
    int x,s,s1;
    for(int i=1;i<=5;i++) {
    printf("Enter %d. digit of binary number",i);
    scanf("%d",&B[i]);}

B[5]とにかく配列の境界外にある要素にアクセスしているので悪いですがB[0]、2番目のループで使用するものを初期化することもありません

    x=B[4];
    for (int i=3;i>=0;i--)
    {
        x=2*x+B[i];  
    }

最初のループを次のように変更してみてください

    for(int i=0;i<5;i++) {
        printf("Enter %d. digit of binary number",i);
        scanf("%d",&B[i]);
    }

これで期待どおりの結果が得られるかどうかを確認します。

また、このコード

    s=B[5];   /*this part for reverse the array*/
    B[5]=B[1];
    B[1]=s;

    s1=B[4];
    B[4]=B[2];
    B[2]=s1;

B を 5 つの整数の配列として宣言し、配列には 0 から始まるインデックスがあるため、問題があります。有効なインデックスの値は 0 から 4 までです。配列を正しく逆にしたい場合は、コードを次のように置き換えます。

    s=B[4];   /*this part for reverse the array*/
    B[4]=B[0];
    B[0]=s;

    s1=B[3];
    B[3]=B[1];
    B[1]=s1;

これは配列の境界外であるため、B[5] にアクセスしてはいけません!!!!

于 2012-06-29T19:52:52.777 に答える
0

アレイを元に戻す必要はありません。

于 2012-06-29T19:54:43.303 に答える