将罗马数字的基础数值保存下来,基础数值包括题目中给出的7个以及它们之间符合规定的相减形式,全部的基础罗马数值string s[15]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}。而后对每个阿拉伯数字用贪心策略转换成罗马数字,保存为string类型,统计string中每一个字符出现的次数。而后打印出现次数非零的字符及出现次数便可。ios
/* 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; }