对于大型作业的一部分,我正在编写一个将二进制数转换为小数的程序。我知道我这样做的方式有点奇怪,可能会有所改进,但我喜欢它现在的样子,它几乎可以工作。唯一的问题是如果你把它作为你的二进制数字10,它返回1,但它应该返回2.我测试的所有其他数字正常工作。这是代码的相关部分:
int countDigits (int num) {
int digits = 0;
while (num != 0) {
num /=10;
digits++;
}
return digits;
}
long int binToDec (int num) {
int numDigits = countDigits(num);
char temp[32];
int numStore[32];
long int sum = 0;
snprintf(temp, 32, "%d", num);
for (int i = 0; i < numDigits; i++) {
numStore[i] = temp[i] - '0';
}
for (int i = 0; i < numDigits; i++) {
if (numStore[i] == 1) {
sum += pow(2, i);
}
}
printf("%ld\n", sum);
return sum;
}
int main(void) {
binToDec(10);
return 0;
}
我绝对无法弄清楚为什么它没有返回正确的值。起初我以为我是以错误的顺序迭代,但除非我做错了,否则计算我而不是向上产生相同的输出。有人可以指出我的错误吗?
答案 0 :(得分:1)
我喜欢毫无意义但又有趣的十进制编码二进制(DCB)表示,但是你可以设计这个。考虑使用countDigits()
函数中的逻辑作为binToDec()
的基础,您可以获得更简单的内容:
#include <stdio.h>
#include <math.h>
unsigned int binToDec(unsigned long number) {
unsigned int sum = 0;
for (unsigned int i = 0; number > 0; i++, number /= 10) {
if (number % 2 != 0) {
sum += pow(2, i);
}
}
return sum;
}
int main(void) {
printf("%u\n", binToDec(101010));
return 0;
}
<强>输出强>
> ./a.out
42
> dc
2 i
101010 p
42
>
并且输入10
会为您提供2
的输出。