如何正确实现任意进制转换?我的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; }
问题原因
- 余数计算逻辑错误:循环中始终用原始输入的
num1取余,而非当前迭代的quotient。每次循环的quotient是上一次除以进制数后的结果,只有对当前quotient取余,才能得到对应位的正确数值。 - 浮点数精度偏差:
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
相关产品推荐
相关产品推荐

