You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:15:28