C语言 2进制转化成10进制的问题。。

来源:百度知道 编辑:UC知道 时间:2024/05/19 03:12:04
额。。我很菜。。只做出了整数部分。。小数部分输出来..结果不对。。请各位大侠帮偶看看哪里错了。。。
#include <stdio.h>
#include <math.h>

int main (void) {
int i = 0, returnvalue, x;
float p = 0.0;
char s[200];

returnvalue = scanf("%s", s);
for (i = 0; i<200; i++) {
x = s[i];
p = x*pow(2, -(i+1)) + p;
}

printf("%f\n", p);
return 0;
}

要求是比如我输入011,然后算出0*2^-1 + 1*2^-2 + 1*2^-3 = 0.375.。。
但是偶算出来时40多。。。知道是STRING用错了。。请大家指教下。。在线等哦着急。。

不对的地方:
所有的字符都有值的,因为都有ASCII码的。
你那个循环的时候,不能循环到200,对于之前声明的空数组,他也有自己的ASCII码的,因此就不对了。
还有就是,对于你读入字符数字内的011,他是字符型的0 1 1。应该减去48,编程数字的0 1 1。
还有就是那个p = x * pow(2, -(i+1)) + p;
应该是p = x * pow(2.0, (float)(i+1)) + p;
pow(x,y), x和y都得是浮点数,不然会警告的,有些编译器是过不了的,得加个类型强制转换。
strlen();是用来测长度的。

#include <stdio.h>
#include <math.h>

int main (void)
{
int i = 0, returnvalue, x;
float p = 0.0;
char s[200];
int len;

returnvalue = scanf("%s",s);
len = strlen(s);
for (i = 0; i < len; i++)
{
x = s[i] - 48;
p = x*pow(2.0, (double)(i+1)) + p;
}

printf("%f\n", p);
return 0;
}

希望可以有用 。

x = s[i];
p = x*pow(2, -(i+1)) + p;

这里的x为0或者1的ASCII码,而不是0或者1,当然不对了。

for (i = 0; i<200; i++)这个循环也是有问题的。
应该改为:
while((i<200) && (s[i]!='\0'))