#22430: 解題思路


loyuqingan@gmail.com (v銀色流星)

學校 : 不指定學校
編號 : 121231
來源 : [180.176.68.51]
最後登入時間 :
2020-09-09 15:37:59
a013. 羅馬數字 -- NPSC 模擬試題 | From: [180.176.68.51] | 發表日期 : 2020-09-03 12:42

這題可以簡單想成兩個部分,一是把羅馬數字轉成整數,二是把數字轉成羅馬數字

羅馬數字的規則是大的數在左邊,羅馬數字要轉成數字可以從最大的數開始減,利用陣列來判斷

羅馬數字要轉成數字比較難,因為有IV這種特殊規則,不過羅馬數字大的字母在左邊,可以利用這規則來判斷

<-------------------------底下是解答請仔細思考後還是想不出來在往下觀看----------------------------------->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include<iostream>

#include <string>

using namespace std;

 

char r2[7]={'M','D','C','L','X','V','I'};

int s2[7]={1000,500,100,50,10,5,1};

string r[13]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

int  s[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};

 

string intToRoman(int a){

if(a==0) return "ZERO";

string roman="";

for(int i=0;i<13;i++){

while(a>=s[i]){

a-=s[i];

roman+=r[i];

}

}

return roman;

}

 

int romanToInt(string a){

int b,c,point=0;

for(int i=0;i<a.size();i++){

b=0,c=0;

for(int j=0;j<7;j++){

if(a[i]==r2[j]) b=s2[j];

if(i+1<a.size()){

if(a[i+1]==r2[j]) c=s2[j];

    }

}

if(b<c){

point+=c-b;

i++;

}else{

point+=b;

}

}

return point;

}

 

 

int main(){

   int c,d;

   string a,b;

   while(cin>>a>>b){

   c=romanToInt(a);

   d=romanToInt(b);

   c-=d;

   if(c<0) c*=-1;

   b=intToRoman(c);

   cout<<b<<endl;

   }

   

return 0; 

}

 
ZeroJudge Forum