我有一个简单的代码来转换二进制到十进制数。在我的编译器中,分解对于小于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);
}发布于 2012-09-09 20:15:14
是的,试试这个:
#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-09 19:19:24
这很可能是因为您正在使用int来存储二进制数。int不会存储超过2^31的数字,它是10位数,1023是您可以用10位二进制数获得的最大数。
对于您来说,将输入数字作为字符串读取,然后处理字符串中的每个字符会容易得多。
发布于 2012-09-09 19:42:35
经过一些实验后,我认为您的程序打算接受一个只包含1和0的数字作为基数10( %d读取的是十进制数)。例如,给定输入10,它输出2;给定1010,它输出10;给定10111001,它输出185。
到现在为止还好。不幸的是,给定1234,它输出的是15,这有点出乎意料。
如果您运行的机器上的int是一个32位有符号值,那么您输入的数字不能超过10位,因为您超出了32位int的限制(按四舍五入计算,它可以处理±20亿)。scanf()函数不能很好地处理溢出。
您可以通过回显输入来帮助自己;这是一种标准的调试技术。确保计算机获得了您期望的值。
我不打算尝试修复代码,因为我认为您正在以完全错误的方式来解决问题。(我甚至不确定它是二进制到十进制,还是十进制到二进制,还是十进制到二进制!)最好将输入读取为一个(最多31个)字符的字符串,然后验证每个字符是否为0或1。假设这是正确的,那么您可以非常直接地处理该字符串,以生成一个可以由printf()格式化为小数的值。
https://stackoverflow.com/questions/12338584
复制相似问题