网站首页 > 技术文章 正文
罗马数字由七个不同的符号组成: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;
}
逐行解析:
- getValue函数:
int getValue(char c) {
switch(c) {
case 'I': return 1;
// ...其他字符处理...
default: return 0;
}
}
- 通过switch语句将罗马字符映射为对应的整数值
- 非法字符(如小写字母)返回0,但题目保证输入合法
- 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;
}
- 核心逻辑:当前值小于下一个值时,进行减法计算并跳两个字符
- 否则直接累加当前值并处理下一个字符
- 测试代码:
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),仅使用固定大小的额外空间
- 符合罗马数字的书写规则,正确处理所有合法输入情况
- 上一篇: C++异常处理
- 下一篇: 很多C语言初学者都非常好奇的问题,怎样定义可以可变参数函数?
猜你喜欢
- 2025-08-02 C|在一个结构体嵌套一个共用体实现一体多用
- 2025-08-02 C++中,常用的强制类型转换函数
- 2025-08-02 如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 2025-08-02 C++20 新特性(24):模板访问权限和typename的放宽
- 2025-08-02 C++零基础到工程实践
- 2025-05-14 “Rust真能防住C代码里的那些老问题吗?我们做了个实验验证”
- 2025-05-14 C语言连续生成不同的随机数方法实例加程序
- 2025-05-14 C++20尝鲜:新增语法糖
- 2025-05-14 C 语言的整数提升
- 2025-05-14 C语言之位运算符
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1524℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 663℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 530℃MySQL service启动脚本浅析(r12笔记第59天)
- 494℃启用MySQL查询缓存(mysql8.0查询缓存)
- 493℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 463℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 461℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)