我应该创建一个将罗马数字转换为十进制值的程序。我做了些什么,但数学错了。当进入MCMLXXVIII时,我应该得到1978,而我得到2178.我使用子串来解决这个问题,但我没有得到任何地方。有人可以告诉我该做什么吗?
由于
#include<iomanip>
#include<iostream>
#include<string>
using namespace std;
int main(){
int M = 1000;
int D = 500;
int C = 100;
int L = 50;
int X = 10;
int V = 5;
int I = 1;
int num = 0;
cout << " Enter the Roman Numeral Value: ";
string roman;
cin >> roman;
string sub = roman.substr(0, 2);
cout << sub << endl;
for (int i = 0; i < roman.length(); i++)
{
switch (roman.at(i))
{
case 'M':
case 'm':
num += M;
break;
case 'D':
case 'd':
num += D;
break;
case 'C':
case 'c':
num += C;
break;
case 'L':
case 'l':
num += L;
break;
case 'X':
case 'x':
num += X;
break;
case 'V':
case 'v':
num += V;
break;
case 'I':
case 'i':
num += I;
break;
}
}
cout << num << endl;
}
答案 0 :(得分:1)
问题是你正在将字符串作为顺序处理。
MCM实际上是M +(M-C),即1000 +(1000-100)= 1000 + 900 = 1900。
您的代码只是添加它,结果是
MCM变为M + C + M,变为1000 + 100 + 1000 == 2100
这就是为什么你得到2178而不是1978年
你需要的是检查你是否遇到一个角色,前面是否有任何一个角色值较低的角色。
因此,如果您遇到C,请检查前面的任何字符是否为M
如果遇到L,请检查前面是否有C,
如果遇到X,请检查前面是否有L,依此类推。
这是一个似乎有效的实现:
int Main()
{
int num = 0;
string ignoreNextChar = "false";
string roman = "MCMLXXVIII".ToUpper();
for (int i = 0; i < roman.length(); i++)
{
if (ignoreNextChar == "true")
{
ignoreNextChar = "false";
continue;
}
int anyBloodyNameHere = GetValue(roman.at(i));
if ((i+1) < roman.length())
{
int nextVal = GetValue(roman.at(i + 1));
if (nextVal > anyBloodyNameHere )
{
num += nextVal - anyBloodyNameHere ;
ignoreNextChar = "true";
continue;
}
}
num += GetValue(roman.at(i));
}
cout << num << endl;
}
int GetValue(char romanNumeral)
{
switch (romanNumeral)
{
case 'M':
return 1000;
case 'D':
return 500;
case 'C':
return 100;
case 'L':
return 50;
case 'X':
return 10;
case 'V':
return 5;
case 'I':
return 1;
}
return 0;
}