罗马数字

题目链接
我们今日大多数时候习惯于使用阿拉伯数字,但是同时有时候我们还会使用一种数字——罗马数字。传统罗马数字用单个字母表示特定的数值,I表示1,V表示5,X表示10,L表示50,C表示100,D表示500,M表示1000。

最多3个同样的I,X,C或M可以连续出现表示一个数字,V,L,D则不在一个数字中连续出现。例如II表示2,CCC表示300。但是要注意,IIII就不能表示4。有时,一个可表示为10n的数出现在一个比它大1级或2级的数前(I在V或X前面,X在L或C前面,等等),数值等于后面的那个数减去前面的那个数,例如IV表示4,XL表示40等(像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多)。

除了“CCLXVIII = 100+100+50+10+5+1+1+1 = 268”,一般来说,字符以递减的顺序接连出现。

输入包括一行,为一个给定的N(1≤N≤3500)。

输出包括多行,第一行为1,2…N这些数字的罗马数字表示中I出现的次数,并在前面加上“I ”。第二行为1,2…N这些数字的罗马数字表示中V出现的次数,并在前面加上“V ”,接下去依次类推并按从小到大的顺序排列,但请注意不要输出并没有出现过的字符。

比如N = 5, 那么页码数为: I, II, III, IV, V. 总共有7个I出现,2个V出现,输出结果如样例。

样例输入

5

样例输出

I 7
V 2

罗马数字转换成整数
整数转换成罗马数字

解题思路:
将每一个数全部转化成罗马数字,然后在进行判断。。。。。

#include<bits/stdc++.h>
using namespace std;
char* str[5][10] = {
        //注意一点一定要定义为char* 类型,即指针类型,否则的话,char类型会因为超过一个字符而报错
        //将1,2,3,...,7,8,9,10,20,30...100,200,1000,2000,3000这些整数保存到一个二维数组中
        {"","","","","","","","","",""},
        {"","I","II","III","IV","V","VI","VII","VIII","IX"},
        {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
        {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
        {"","M","MM","MMM"}
};
int main(){
    int a,k,x,arr[5];
    string s;
    map <char,int> mp;
    map <char,int>::iterator it;
    scanf("%d",&a);
    k = 1;
    for(int i = 1;i <= a;i++){//把每一个数字转化成罗马数字
        x = i;
        while(x){
            arr[k++] = x % 10;
            x /= 10;
        }
        for(int j = k - 1;j >= 1;j--)
            s += str[j][arr[j]];//转化成字符串
        k = 1;//必须重置为1
    }
    for(int i = 0;i < s.size();i++)
        mp[s[i]]++;///I表示1,V表示5,X表示10,L表示50,C表示100,D表示500,M表示1000
    if(mp['I'])
        cout << 'I' << " " << mp['I'] << endl;
    if(mp['V'])
        cout << 'V' << " " << mp['V'] << endl;
    if(mp['X'])
        cout << 'X' << " " << mp['X'] << endl;
    if(mp['L'])
        cout << 'L' << " " << mp['L'] << endl;
    if(mp['C'])
        cout << 'C' << " " << mp['C'] << endl;
    if(mp['D'])
        cout << 'D' << " " << mp['D'] << endl;
    if(mp['M'])
        cout << 'M' << " " << mp['M'] << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37708702/article/details/80186272