将罗马数字的基础数值保存下来,基础数值包括题目中给出的7个以及它们之间符合规定的相减形式,所有的基础罗马数值string s[15]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}。然后对每一个阿拉伯数字用贪心策略转换成罗马数字,保存为string类型,统计string中每个字符出现的次数。然后打印出现次数非零的字符及出现次数即可。
/*
ID:jzzlee1
PROG:preface
LANG:C++
Dear double_tings:
i love you.
*/
#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
using namespace std;
ifstream fin("preface.in");
ofstream fout("preface.out");
string s[15]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};//保存基础罗马数值
int a[15]={1000,900,500,400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };//对应的阿拉伯数字
int ans[10]={0};//记录结果出现的次数
char ss[10]={'I','V','X','L','C','D','M'};
string change(int temp) //将阿拉伯数字转换为罗马数字
{
string str;int i,j=0;
while(temp)
{
for(i=j;i<13;i++)
{
if(temp>=a[i])
{
temp-=a[i];
str+=s[i];
j=i;
break;
}
}
}
return str;
}
void cal(string str)//统计每个字符出现的次数
{
string::size_type i=0;
for(i=0;i!=str.size();++i)
{
switch(str[i])
{
case 'I':
++ans[0];
break;
case 'V':
++ans[1];
break;
case'X':
++ans[2];
break;
case'L':
++ans[3];
break;
case'C':
++ans[4];
break;
case'D':
++ans[5];
break;
case'M':
++ans[6];
break;
}
}
}
int main()
{
int n;
fin>>n;
//cin>>n;
int i;
string str;
for(i=1;i<=n;++i)
{
str+=change(i);//将所有罗马字符保存到一起
}
cal(str);
for(i=0;i!=7;++i)
if(ans[i])
fout<<ss[i]<<" "<<ans[i]<<endl;
//cout<<ss[i]<<" "<<ans[i]<<endl;
return 0;
}