2.2.1 PREFACE NUMBERING 序言頁(yè)碼

2018-06-19 14:06 更新

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2325

題目大意:(如題)

輸入輸出:(如題)

解題思路:

1.用打表法將每個(gè)數(shù)N(1<=N<3500)中間“I”“V”“X”“L”“C”“D”“M”的個(gè)數(shù)統(tǒng)計(jì)出來(lái),用一個(gè)二維數(shù)組cnt[3500][7]保存起來(lái)。

2.枚舉。從千位開始枚舉,一直枚舉到個(gè)位為止,每次判斷減掉那個(gè)數(shù)之后剩下的數(shù)是否還不小于0。如果不小于則繼續(xù),反之結(jié)束。

3.減小代碼的方法。

(1) 10進(jìn)制數(shù)到羅馬數(shù)字的轉(zhuǎn)換表:

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) 字符到數(shù)組下標(biāo)的轉(zhuǎn)換表:

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;
      }
     }
    }
   }
  }
 }

環(huán)境惡劣……給力……


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)