我不能在C语言中将十进制转换为二进制。每次我得到的输出都比所需的输出少一。例如:5应该是101,但显示为100或4应该是100,但显示为99。
#include<stdio.h>
#include<math.h>
void main() {
int a,b=0;
int n;
printf("Enter a Decimal Number\n");
scanf("%d",&n);
for(int i=0;n>0;i++) {
a=n%2;
n=n/2;
b=b+(pow(10,i)*a);
}
printf("%d",b);
}
我的输出总是比正确答案少一,我不知道为什么。如果一开始把b当作1而不是0,它就解决了这个问题,但我不知道为什么。请帮助。我几天前才开始使用C。
2条答案
按热度按时间zi8p0yeb1#
pow
是浮点函数;它接受一个double
参数并返回一个double
值。在您正在使用的C实现中,pow
的实现很糟糕。即使正确的结果是可以精确表示的,它也不总是产生正确的结果。请停止将它用于整数运算。重写代码以使用整数算术计算所需的10的幂。
另外,不要通过在
int
类型中将二进制数字编码为十进制来计算二进制数字。这是浪费的,而且很快就会进入类型的界限。使用unsigned
类型中的位或char
的数组。当scanf("%d",&n);
执行时,它将输入字符串转换为二进制并将其存储在n
中。因此n
已经是二进制的;你不需要解码它。2用一个循环找到它的最高位。3然后用另一个循环打印从那个位置到最低有效位的每一位。huwehgph2#
这段代码看起来不错。我很快在一个在线编译器上测试了它,看起来工作得还可以。
我非常肯定它与不同版本的编译器有关。编译器,我在其中测试了您的代码:https://www.onlinegdb.com/online_c_compiler
编辑:
pow()
函数在与整数一起使用时不可靠,因为您作为参数传递给它的整数被隐式转换为double数据类型,并返回double作为输出。当您再次将此值填充到整数中时,它将丢弃十进制值。一些编译器似乎使用其版本的pow()
生成“正确”的结果,而一些编译器则没有。相反,您可以使用不同的方法来解决十进制到二进制的转换,而不会在一般使用中出现错误: