我需要将罗马数字转换为整数值,顺序无关紧要。 (9 = VIIII)
目前我开始从我的代码中得到一个软糖因子,它在我实施X时从20开始到达到M时达到530.我不能简单地将其分解为当I = 531和V = 535时,MDCLXVI = 1560.那和eclipse有时会说它不能运行,有时可以运行。
这是代码
C int romanToInt(char *s) {
int n, k=0;
while(k<[MAX_LINE]) {
if(s[k]==’I’) {
n=n++
}
if(s[k]==’v’) {
n=n+5
}
if(s[k]==’X’) {
n=n+10
}
if(s[k]==’L’) {
n=n+50
}
if(s[k]==’C’) {
n=n+100
}
if(s[k]==’D’) {
n=n+500
}
if(s[k]==’M’) {
n=n+1000
}
return n;
}
感谢您的帮助。
答案 0 :(得分:2)
你初始化你的循环计数器k,但不是你的累加器,n。初始化n = 0; C假设你知道你正在做什么,所以它不会像一些OOP语言那样自动将int初始化为零。所以,你可以从垃圾开始,这会抛弃你所有的计算。 第二:为什么n = n ++?用户n + = 1或n ++
另外,for循环可能比while循环更好,因为它会强制你初始化你的计数器变量(如果你还没有)并设置迭代次数的限制,所以几乎没有任何无限的机会循环。
最后,考虑if / else if或select / case,而不是所有ifs。
哦,我确定这可能是一个错字,但你的return语句应该在循环结束之后。你要么忘了在return语句之前添加额外的大括号,要么我错误计算了。答案 1 :(得分:1)
这里有几件事情。
int n, k=0;
您应该将两个变量初始化为0.目前,您只需初始化k
。 n
可能包含垃圾。
while(k<[MAX_LINE]) ...
该语法不应该编译。但即使它确实如此,也不是你想要的。我假设MAX_LINE
是您在fgets
或类似函数中使用的最大缓冲区长度。但实际输入通常较小,它包含一个C字符串,即以空字符'\0'
结尾的字符。之后的一切都将是垃圾。因此,您的终止条件应为while (s[k] != '´\0') ...
。由于空字符'\0'
的值为零,因此您可以将其写为while (s[k]) ...
。
if(s[k]==’I’) {
n=n++
}
这种递增语法在C语言中是不合法的。(这是一个常见的陷阱,因为它会编译。)如果你想要n
,请使用普通n++
。或者,您可以使用n = n + 1
或n += 1
。
if(s[k]==’v’) {
n=n+5
}
在这里,您使用了小写'v'
,这与大写'V'
不同。
return n;
您无条件地从循环内返回,即在第一次迭代之后。那不是你想要的。循环后返回累计值。
除非在您的情况下,您有一个无限循环:您的位置标记k
永远不会改变。你应该在循环内增加k
作为最后一件事。您还可以在更新部分中将while
重写为for
和incrementb。
所以,把它们放在一起:
int romanToInt(const char *s)
{
int n = 0;
int k = 0;
while (s[k]) {
if (s[k] == 'I') n++;
if (s[k] == 'V') n = n + 5;
if (s[k] == 'X') n = n + 10;
if (s[k] == 'L') n = n + 50;
if (s[k] == 'C') n = n + 100;
if (s[k] == 'D') n = n + 500;
if (s[k] == 'M') n = n + 1000;
k++;
}
return n;
}
这将累积由大写字母表示的罗马数字(不执行IV中的减法操作)并忽略其他所有内容。