您的位置:首页 > 其它

计蒜客 难题题库 032 罗马数字

2015-08-10 09:21 344 查看
165次
24.8%
1000ms
65536K

我们今日大多数时候习惯于使用阿拉伯数字,但是同时有时候我们还会使用一种数字——罗马数字。传统罗马数字用单个字母表示特定的数值,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出现,输出结果如样例。

样例1

输入:
5


输出:
I 7
V 2


#include<iostream>
#include<string>
using namespace std;

string numToStr(int n){
int num[] = {   1,    4,   5,    9,  10,   40,  50,   90, 100,  400, 500,  900,1000};
string s[] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
cin >> n;
string res;
for(int i = 12; i >= 0; --i){
while(n >= num[i]){
n -= num[i];
res += s[i];
}
}
return res;
}

int main(){
int cI = 0, cV = 0, cX = 0, cL = 0, cC = 0, cD = 0, cM = 0;
int n;
string s;
cin >> n;
for(int i = 1; i <= n; ++i){
s = numToStr(i);
for(int j = 0; j < s.size(); ++j){
switch(s[j]){
case 'I':
++cI;
break;
case 'V':
++cV;
break;
case 'X':
++cX;
break;
case 'L':
++cL;
break;
case 'C':
++cC;
break;
case 'D':
++cD;
break;
case 'M':
++cM;
break;
default:
break;
}
}
}
if(cI){
cout << "I " << cI << endl;
}
if(cV){
cout << "V " << cV << endl;
}
if(cX){
cout << "X " << cX << endl;
}
if(cL){
cout << "L " << cL << endl;
}
if(cC){
cout << "C " << cC << endl;
}
if(cD){
cout << "D " << cD << endl;
}
if(cM){
cout << "M " << cM << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: