目录
按照简单题的顺序,选择了第13题,一看题目我???,什么东西,怎么看懂一个罗马数字还需要运算。按照遇事不决先刷评论区的习惯就看到了下图:
这老哥是懂罗马的。
但是题目我们还是需要阅读一遍的:
题目还是比较长的,主要解释了一遍怎么看懂罗马数字以及他的组合规则是什么。
I 理解题目需求
1.设计一个程序,这个程序可以将罗马数字转换成整数。
2.理解罗马数字的组合规则。
3.按照所给定的代码模版完成题目。
一、罗马数字的组合规律
按照题目所给出的资料,我们可以得出:
1.罗马数字是通过'I', 'V', 'X', 'L', 'C', 'D', 'M'这七种字符排列组合来形成新的数值的。
2.小的字符在大的字符的左边,那么这个数值就是由大的字符减去小的字符而形成的新的数值。
3.小的字符在大的字符的右边,那么这个数值就是由大的字符加上小的字符而形成的新的数值。
下面是本次题目的模版:
int romanToInt(char* s) {
}
int romanToInt(char* s)
是一个函数声明,它表示一个函数 romanToInt
,该函数接受一个字符指针 s
(通常指向一个以 null 结尾的字符串)作为参数,并返回一个整数(int
)。
II 设计程序(参考:断然Juvenile)
int romanToInt(char * s){
int result=0,roman=0,temp=0;
while (*s){
switch (*s){
case 'I':temp =1;break;
case 'V':temp =5;break;
case 'X':temp =10;break;
case 'L':temp =50;break;
case 'C':temp =100;break;
case 'D':temp =500;break;
case 'M':temp =1000;
}
if(temp>roman)
{
result = result + (temp - roman) - roman;
}
else
{
result = result + temp;
}
roman = temp;
*s++;
}
return result;
}
III 代码解析
首先,函数片段的假设是 temp
、result
和 roman
是已经在函数外部定义好的整数变量。
1.循环结构:
while (*s) {
...
*s++;
}
这个 while
循环会持续执行,直到字符串 s
的当前字符为 null 字符(即字符串的结尾)。在每次循环的末尾,指针 s
递增,指向下一个字符。
2.switch 语句:
switch (*s) {
...
}
switch语句根据当前字符
*s的值设置
temp的值。这里
temp 变量被用来存储当前罗马数字字符对应的整数值。
3.核心逻辑:
if(temp > roman) {
result = result + (temp - roman) - roman;
} else {
result = result + temp;
}
roman = temp;
这里的逻辑是处理罗马数字中特殊的减法规则(如 IV 表示 4,而不是 5)。
4.变量初始化:
需要注意的是,此代码片段没有显示 temp
、result
和 roman
的初始化。在实际的函数中,你需要确保这些变量在使用前被正确初始化。通常,result
应该初始化为 0。而 roman
可以初始化为一个不可能的值(如 0 或一个比任何罗马数字都小的值),以确保第一次比较时能够正确处理。
5.返回值:
return result;
在循环结束后,函数返回转换后的整数 result
。