將羅馬數字的基礎數值保存下來,基礎數值包括題目中給出的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; }