罗马数字翻译中的随机添加

时间:2014-12-01 18:49:56

标签: c eclipse roman-numerals

我需要将罗马数字转换为整数值,顺序无关紧要。 (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;
  }

感谢您的帮助。

2 个答案:

答案 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.目前,您只需初始化kn可能包含垃圾。

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 + 1n += 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中的减法操作)并忽略其他所有内容。