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; }
代码说明
- 辅助函数:
romanCharToValue统一处理字符到数值的映射,避免重复代码,逻辑更清晰。 - 转换逻辑:遍历罗马数字字符串,逐个比较当前字符和下一个字符的数值:
- 若当前值 < 下一个值,执行减法(如CM=1000-100=900),并跳过下一个字符;
- 否则直接累加当前值。
- 边界处理:当遍历到最后一个字符时,
i < len -1为假,直接累加当前值,无需额外处理。
内容的提问来源于stack exchange,提问作者Berat Zengin
相关产品推荐
相关产品推荐

