如何修改C语言罗马数字转换器代码以正确识别数位?
十进制转罗马数字C代码修复方案
现有代码问题梳理
- 输入逻辑冲突:函数已定义
num作为入参,内部又通过scanf覆盖该参数值,调用逻辑混乱,建议将输入逻辑移到main函数,转换函数仅负责转换输出。 - 千位处理错误:1000对应的罗马字符是M而非C,且大于等于2000的数值需要输出对应数量的M,当前代码仅输出1个字符就直接取模截断,会丢失高位,你提到的
num/1000、num%1000逻辑就是用来解决这个问题的。 - 百位、十位、个位的重复字符处理缺失:比如200需要输出2个C、30需要输出3个X、3需要输出3个I,当前代码对应分支仅输出1个字符就截断数值,结果不符合预期。
- 个位取模逻辑错误:原代码个位大于等于1小于4的分支输出1个I后直接将num设为0,无法正确输出2、3对应的II、III。
修复后完整代码
#include <stdio.h> void decimal_to_roman(int num) { while(num != 0) { // 千位处理:使用你提到的num/1000和num%1000逻辑 if (num >= 1000) { int m_cnt = num / 1000; for(int i = 0; i < m_cnt; i++) { printf("M"); } num = num % 1000; } // 500、900处理 else if (num >= 500) { if (num < 900) { printf("D"); num = num % 500; } else { printf("CM"); num = num % 100; } } // 100、400处理 else if (num >= 100) { if (num < 400) { int c_cnt = num / 100; for(int i = 0; i < c_cnt; i++) { printf("C"); } num = num % 100; } else { printf("CD"); num = num % 100; } } // 50、90处理 else if (num >= 50) { if (num < 90) { printf("L"); num = num % 50; } else { printf("XC"); num = num % 10; } } // 10、40处理 else if (num >= 10) { if (num < 40) { int x_cnt = num / 10; for(int i = 0; i < x_cnt; i++) { printf("X"); } num = num % 10; } else { printf("XL"); num = num % 10; } } // 5、9处理 else if (num >= 5) { if (num < 9) { printf("V"); num = num % 5; } else { printf("IX"); num = 0; } } // 1、4处理 else if (num >= 1) { if (num < 4) { for(int i = 0; i < num; i++) { printf("I"); } num = 0; } else { printf("IV"); num = 0; } } } } int main() { int num; printf("请输入十进制整数:"); scanf("%d", &num); printf("对应的罗马数字为:"); decimal_to_roman(num); printf("\n"); return 0; }
核心修改说明
- 千位部分新增
num / 1000计算需要打印的M的数量,循环输出后用num % 1000保留剩余低位继续处理,完美实现了你想要加入的逻辑 - 百位、十位、个位的常规重复字符分支都新增了对应位数的计数循环,解决了多相同字符无法输出的问题
- 把输入逻辑移到了main函数,转换函数职责更清晰,不会出现参数被覆盖的问题
- 修正了千位字符错误,把原代码的
printf("C")改成了printf("M")
内容的提问来源于stack exchange,提问作者Adam X
相关产品推荐
相关产品推荐

