优秀的编程知识分享平台

网站首页 > 技术文章 正文

C语言实现罗马数字转整数

nanyue 2025-05-14 15:27:04 技术文章 5 ℃

罗马数字由七个不同的符号组成:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)。通常,罗马数字的写法是从左到右,大的数字在前,小的在后。但如果小的数字在大的前面,那就要减去它,比如IV是4,IX是9,XL是40,等等。


以下是C语言实现罗马数字转整数的代码:

#include <stdio.h>

// 将罗马数字字符转换为对应的整数值
int getValue(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; // 非法字符返回0
    }
}

int romanToInt(char* s) {
    int sum = 0;    // 存储最终结果
    int i = 0;      // 遍历字符串的索引
    
    while (s[i] != '\0') {          // 遍历整个字符串
        int current = getValue(s[i]); // 当前字符值
        
        // 获取下一个字符值(如果存在)
        int next = 0;
        if (s[i+1] != '\0') {
            next = getValue(s[i+1]);
        }
        
        if (current < next) {   // 处理减法情况(如IV=4)
            sum += (next - current);
            i += 2;             // 跳过两个字符
        } else {                // 正常加法情况(如III=3)
            sum += current;
            i += 1;             // 处理下一个字符
        }
    }
    return sum;
}

/* 测试代码 */
int main() {
    char* testCases[] = {"III", "IV", "IX", "LVIII", "MCMXCIV"};
    int expected[] = {3, 4, 9, 58, 1994};
    
    for (int i = 0; i < 5; i++) {
        int result = romanToInt(testCases[i]);
        printf("输入:%s\n输出:%d\n预期:%d\n\n", 
              testCases[i], result, expected[i]);
    }
    return 0;
}

逐行解析

  1. getValue函数
int getValue(char c) {
    switch(c) {
        case 'I': return 1;
        // ...其他字符处理...
        default: return 0;
    }
}
  • 通过switch语句将罗马字符映射为对应的整数值
  • 非法字符(如小写字母)返回0,但题目保证输入合法
  1. romanToInt函数
int romanToInt(char* s) {
    int sum = 0;    // 初始化总和
    int i = 0;      // 字符串索引
  • 初始化累加器和索引
while (s[i] != '\0') {          // 遍历字符串
    int current = getValue(s[i]); // 当前值
  • 循环直到字符串结束
  • 获取当前字符对应的数值
  • int next = 0;
    if (s[i+1] != '\0') {
        next = getValue(s[i+1]);
    }
    • 获取下一个字符的值(如果存在)
    if (current < next) {   // 处理特殊情况
        sum += (next - current);
        i += 2;             // 跳过两个字符
    } else {                // 正常情况
        sum += current;
        i += 1;
    }
    • 核心逻辑:当前值小于下一个值时,进行减法计算并跳两个字符
    • 否则直接累加当前值并处理下一个字符
    1. 测试代码
    char* testCases[] = {"III", "IV", ...};
    int expected[] = {3, 4, ...};

    提供标准测试用例验证代码正确性

    执行结果

    输入:III
    输出:3
    预期:3
    
    输入:IV
    输出:4
    预期:4
    
    输入:IX
    输出:9
    预期:9
    
    输入:LVIII
    输出:58
    预期:58
    
    输入:MCMXCIV
    输出:1994
    预期:1994

    算法特点

    • 时间复杂度:O(n),只需一次遍历
    • 空间复杂度:O(1),仅使用固定大小的额外空间
    • 符合罗马数字的书写规则,正确处理所有合法输入情况

    Tags:

    最近发表
    标签列表