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

如何修改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;
}

核心修改说明

  1. 千位部分新增num / 1000计算需要打印的M的数量,循环输出后用num % 1000保留剩余低位继续处理,完美实现了你想要加入的逻辑
  2. 百位、十位、个位的常规重复字符分支都新增了对应位数的计数循环,解决了多相同字符无法输出的问题
  3. 把输入逻辑移到了main函数,转换函数职责更清晰,不会出现参数被覆盖的问题
  4. 修正了千位字符错误,把原代码的printf("C")改成了printf("M")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:39:00