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

如何正确实现任意进制转换?我的C语言转换代码输出异常

进制转换程序的问题分析与修复

问题现象

  • 执行./base.o 42 2(将42转换为二进制),输出结果为0
  • 执行./base.o 99 5(将99转换为五进制),输出重复的444

原始代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]) {
    int remainder = 0;
    int num0 = 0;
    int i = 0;

    int num1 = atoi(argv[1]);
    int num2 = atoi(argv[2]);
    int quotient = num1;

    while (quotient != 0) {
        remainder = num1 % num2;
        quotient = quotient / num2;

        num0 = (remainder * pow(10, i)) + num0;
        i++;
    }

    printf("%d\n", num0);

    return 0;
}

问题原因

  1. 余数计算逻辑错误:循环中始终用原始输入的num1取余,而非当前迭代的quotient。每次循环的quotient是上一次除以进制数后的结果,只有对当前quotient取余,才能得到对应位的正确数值。
  2. 浮点数精度偏差:pow()是浮点数运算函数,计算pow(10, i)时可能出现精度误差(比如pow(10,3)可能返回999.999999,强转整数后变为999),导致位权重计算错误。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int remainder = 0;
    int num0 = 0;
    int multiplier = 1; // 用整数乘法替代pow,规避浮点数精度问题

    int num1 = atoi(argv[1]);
    int num2 = atoi(argv[2]);
    int quotient = num1;

    while (quotient != 0) {
        remainder = quotient % num2; // 对当前quotient取余,获取正确位值
        quotient = quotient / num2;

        num0 = remainder * multiplier + num0;
        multiplier *= 10; // 每次循环提升位数权重
    }

    printf("%d\n", num0);

    return 0;
}

修复说明

  • 调整余数计算逻辑:将remainder = num1 % num2改为remainder = quotient % num2,确保每次获取的是当前商的余数,对应进制位的数值正确。
  • 替换pow()为整数乘法:用multiplier变量初始值为1,每次循环乘以10,既避免了浮点数精度问题,又能准确计算每一位的权重。

内容的提问来源于stack exchange,提问作者user21031711

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:40:29