计蒜客 罗马数字转成整型数问题

问题描述

给定一个罗马数字 s,将罗马数字转换成整数。

如罗马数字I,II,III,IV,V分别代表数字 1, 2, 3, 4, 5

首先要来了解一下罗马数字表示法,基本字符有 7 个:I、V、X、L、C、D、M,分别表示 1、5、10、50、100、500、1000。

在构成数字的时候,有下列规则:

1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:III = 3;

2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:VIII = 8;XII = 12;

3、小的数字,(限于Ⅰ、X和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:IV = 4;IX = 9;

4、正常使用时,连写的数字重复不得超过三次。

补充规则

5、基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;

6、不能把基本数字 V 、L 、D 中的任何一个作为小数,放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;

输入格式

输入一个罗马数字字符串,其对应的数字为 s(1≤s≤3999)。

输出格式

输出对应的整数 ss。

样例输入

CXXIII

样例输出

123

C++代码实现

#include <iostream>
#include <malloc.h>
#include <string>

using namespace std;

int main()
{
    string s ;//c++中处理字符串时,利用C++自带的string类处理起来很是方便,尤其是在获取实际输入的字符串的长度问题上,
    //直接调用string类的length()方法,可以获取输入的字符串长度。
    //然而在利用sizeof()或者strlen()时,在C语言环境下使用
    //char s[100];
    int i,len,count=0;
    cin>>s;
    //len = sizeof(s)/sizeof(char);
    //len = sizeof(s);
    len = s.length();
    //cout<<len;

    for(i = 0;i<len;i++)
    {
        switch(s[i])
        {
        case 'M':
            count+=1000;//由于输入的范围是固定的,在1到3999,所以,输入的罗马字M(表示1000)的位置肯定是在字符串的最左边,其他字符都是在M的右边。
            break;
        case 'D':
            count+=500;//同理,字符D的右边不可能出现M,所以按照规则6,如果出现在D的左侧,那么结果是DM表示的负数,所以D只能出现在M的右侧,这样才能加上D
            break;
        case 'C':
            if(s[i+1]=='D'||s[i+1]=='M')//表示一旦字符C的右侧出现了字符D和M,那么按照规则6,大的数减去小的数
                count-=100;
            else
                count+=100;
            break;
        case 'L': 
            count+=50;//与字符D规则一样
            break;
        case 'X':
            if(s[i+1]=='L'||s[i+1]=='C')//与字符C的规则一样
                count-=10;
            else
                count+=10;
            break;
        case 'V':
            count+=5;//与字符D规则一样
            break;
        case 'I':
            if(s[i+1]=='V'||s[i+1]=='X')//与字符C的规则一样
                count--;
            else
                count++;
            break;
        default:
            cout<<"error"<<endl;
        }
    }
    cout<<count;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37592397/article/details/79935874