转换为十进制数

时间:2016-05-31 01:09:36

标签: c++

我应该创建一个将罗马数字转换为十进制值的程序。我做了些什么,但数学错了。当进入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;
}

1 个答案:

答案 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;
    }