2.2.1 PREFACE NUMBERING 序言頁碼
阿新 • • 發佈:2017-05-18
margin http 繼續 at-t ica cas art bottom 一個
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2325
題目大意:(如題)
輸入輸出:(如題)
解題思路:
1.用打表法將每一個數N(1<=N<3500)中間“I”“V”“X”“L”“C”“D”“M”的個數統計出來,用一個二維數組cnt[3500][7]保存起來。
2.枚舉。
從千位開始枚舉。一直枚舉到個位為止,每次推斷減掉那個數之後剩下的數是否還不小於0。
假設不小於則繼續。反之結束。
3.減小代碼的方法。
(1) 10進制數到羅馬數字的轉換表:
string rec[4][9]={"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"};
(2) 字符到數組下標的轉換表:
char res[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};
核心代碼:
for(mrk=1;mrk<3500;mrk++) { dat=mrk; for(i=3;i>=0;i--) { for(j=9;j>=1;j--) { tmp=pow((double)10,(double)i)*j; while(dat-tmp>=0) { dat-=tmp; for(k=0;k<rec[i][j-1].length();k++) { switch(rec[i][j-1][k]) { case ‘I‘: cnt[mrk][0]++; break; case ‘V‘: cnt[mrk][1]++; break; case ‘X‘: cnt[mrk][2]++; break; case ‘L‘: cnt[mrk][3]++; break; case ‘C‘: cnt[mrk][4]++; break; case ‘D‘: cnt[mrk][5]++; break; case ‘M‘: cnt[mrk][6]++; break; default: break; } } } } } }
環境惡劣……給力……
2.2.1 PREFACE NUMBERING 序言頁碼