1. 程式人生 > >2.2.1 PREFACE NUMBERING 序言頁碼

2.2.1 PREFACE NUMBERING 序言頁碼

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 序言頁碼