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");
}
答案 0 :(得分: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]
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到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],因为这超出了数组的范围 !!!!
答案 1 :(得分:0)
您无需还原阵列。