求助:C语言二进制转十进制基础程序运行异常排查
C语言二进制转十进制程序调试求助
我写的C语言二进制转十进制程序运行异常,找不到问题在哪。作业要求必须用最基础的实现方式,恳请帮忙排查。
主函数代码
#include <stdio.h> long long int decimal(long long int); int power_2 (int); long int power_10 (int); int main(void){ long long int n; while(1){ printf("Write down a binary number. \n"); scanf("%lld", &n); long long int a = decimal(n); printf("The binary number %lld converted into decimal is: %lld \n", n, a); } }
问题发现
输入1001这类二进制数时,执行减1再除以10操作后余数为0,导致程序进入第二个if语句的逻辑跳转,出现错误。
转换函数(存在问题)
long long int decimal(long long int e){ long long int result; long long int k = 0; int i; for(i=0; i>=0; i++){ if(e % 10 == 1){ k += power_2(i); e--; if(e != 0){ e /= 10; } } if(e % 10 == 0){ e /= 10; if(e==0){ break; } } return(k); }
幂函数代码
// 我认为这个函数应该正常工作,所以没排查这里 int power_2(int n){ int base = 2, i, result = 1; if(n>0){ for(i=1; i<=n; i++){ result *= base; } } if(n=0){ result = 1; } return(result); } // 原本以为需要用到,但实际不需要 long int power_10(int n){ int base = 10, i, result = 1; if(n>0){ for(i=1; i<=n; i++){ result *= base; } } if(n=0){ result = 1; } return(result); }
问题分析与修正
1. power_2函数的致命错误
代码中if(n=0)是赋值操作,不是判断相等!这会导致:
- 当
n>0时,循环计算完正确的幂值后,会执行n=0的赋值,强制将result设为1,返回完全错误的结果。 - 修正:将
if(n=0)改为if(n==0),或者更简洁的方式(因为初始result=1,n=0时直接返回即可,无需额外判断):
int power_2(int n){ int result = 1; for(int i=0; i<n; i++){ result *= 2; } return result; }
2. decimal函数的逻辑混乱
原逻辑中通过e--修改原数,再结合两次独立的if判断,导致数位处理重复或遗漏:
- 无需修改原数,直接通过
e%10提取最后一位,判断是否为1,然后e /=10去掉最后一位即可。 - 用
while(e>0)替代死循环for(i=0; i>=0; i++),逻辑更清晰。
修正后的decimal函数:
long long int decimal(long long int e){ long long int k = 0; int i = 0; while(e > 0){ // 提取最后一位,是1则累加对应2的幂 if(e % 10 == 1){ k += power_2(i); } // 去掉最后一位,处理下一位 e = e / 10; i++; // 幂次递增(从最低位2^0开始) } return k; }
3. 其他优化
power_10函数未被使用,可以直接删除,简化代码。- 输入时注意二进制数不能超过
long long的范围,避免溢出。
内容的提问来源于stack exchange,提问作者dkristof04
相关产品推荐
相关产品推荐

