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

C语言罗马数字转阿拉伯数字程序开发技术求助

C语言罗马数字转阿拉伯数字实现问题

我正在用C语言开发罗马数字转阿拉伯数字的程序,需遵循以下规则:

  • 罗马字母需从左到右按数值从大到小书写;
  • 同一字母不可重复使用4次;
  • 例如表示900需写作CM(即1000-100)而非MC。

目前核心问题是如何将字符串中的罗马字符转换为对应数值,以下是我的代码片段:

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

void main() {

/*
罗马数字与对应数值

I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000

*/

/*
问题1-
MCMVII
MMXI
XC
MCMXC

对应的数值分别是多少

*/
int I = 1;
int V = 5;
int X = 10;
int L = 50;
int C = 100;
int D = 500;
int M = 1000;

char que1[] = "MCMVII";
char que2[] = "MMXI";
char que3[] = "XC";
char que4[] = "MCMXC";

for (int i = 0; i < strlen(que1)-1; i++)
{
    if (que1[i]>que1[i+1])
    {
        printf("%c",que1[i]);
        //之后我会逐个累加字母对应的数值
    }else if (que1[i]<que1[i+1])
    {
        printf("%c",que1[i+1]);
        i++;
        //跳过了第(i+1)个字符
    } 
}
}

核心问题解决思路

要实现罗马字符到数值的映射,最简洁的方式是编写一个辅助函数,输入单个罗马字符,返回对应的阿拉伯数字:

int romanCharToValue(char c) {
    switch(c) {
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        default: return 0; // 处理非法输入字符
    }
}

完整转换逻辑修正

原代码的循环逻辑存在缺陷,正确的转换规则是:如果当前字符的数值小于下一个字符的数值,就用下一个数值减去当前数值并累加;否则直接累加当前数值。同时要处理字符串的最后一个字符。

修正后的完整代码:

#include <stdio.h>
#include <string.h>

int romanCharToValue(char c) {
    switch(c) {
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        default: return 0;
    }
}

int romanToInt(char* s) {
    int result = 0;
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        int current = romanCharToValue(s[i]);
        // 若不是最后一个字符,且当前值小于下一个值
        if (i < len - 1 && current < romanCharToValue(s[i+1])) {
            result += (romanCharToValue(s[i+1]) - current);
            i++; // 跳过下一个字符,避免重复处理
        } else {
            result += current;
        }
    }
    return result;
}

int main() {
    char que1[] = "MCMVII";
    char que2[] = "MMXI";
    char que3[] = "XC";
    char que4[] = "MCMXC";

    printf("%s = %d\n", que1, romanToInt(que1));
    printf("%s = %d\n", que2, romanToInt(que2));
    printf("%s = %d\n", que3, romanToInt(que3));
    printf("%s = %d\n", que4, romanToInt(que4));

    return 0;
}

代码说明

  1. 辅助函数:romanCharToValue 统一处理字符到数值的映射,避免重复代码,逻辑更清晰。
  2. 转换逻辑:遍历罗马数字字符串,逐个比较当前字符和下一个字符的数值:
    • 若当前值 < 下一个值,执行减法(如CM=1000-100=900),并跳过下一个字符;
    • 否则直接累加当前值。
  3. 边界处理:当遍历到最后一个字符时,i < len -1为假,直接累加当前值,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:07:36