羅馬數字 | 數目 |
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1,000 |
例如十七可以表示為
X+V+I+I=XVII 10+5+1+1=17
表示羅馬數字可以使用減法來取代加法的規則。例如四可以不用四個一相加來表示 IIII,而採用五減一來表示 IV。利用這類規則,羅馬人能夠減化許多數目的表示方式,例如 IX 取代 VIIII 表示 9,及 CD 取代 CCCC 表示 400。
輸入說明 :
每個輸入檔中會有一個或以上的測試資料。每一行由兩個數字組成一筆測試資料,且所有數字將會小於4,000。檔案最後會以符號 # 表示結束。
輸出說明 :
每筆測試資料的答案必須輸出到檔案中,並且換行。如果答案為零,則須輸出字串 ZERO。
範例輸入 :
I I MM II #
範例輸出 :
ZERO
MCMXCVIII
以下為程式碼:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<string.h> | |
using namespace std; | |
int rome_to_num (char* input) | |
{ | |
int num[20],tmp,result=0; | |
int size = strlen(input); | |
for (int i = 0; i < size; i++) | |
{ | |
if(input[i]=='I'){ | |
num[i]=1; | |
}else if(input[i]=='V'){ | |
num[i]=5; | |
}else if(input[i]=='X'){ | |
num[i]=10; | |
}else if(input[i]=='L'){ | |
num[i]=50; | |
}else if(input[i]=='C'){ | |
num[i]=100; | |
}else if(input[i]=='D'){ | |
num[i]=500; | |
}else if(input[i]=='M'){ | |
num[i]=1000; | |
} | |
if(i==0){result =num[i];} | |
if(i>0){ | |
if(num[i]>num[i-1]){ | |
tmp = num[i]-num[i-1]; | |
result += tmp; | |
result=result-num[i-1]; | |
}else{ | |
//tmp = num[i]+num[i-1]; | |
result += num[i]; | |
} | |
} | |
} | |
return result; | |
} | |
int num_to_rome(int input, char* output){ | |
if (input ==0){ | |
output[0] ='Z'; | |
output[1] ='E'; | |
output[2] ='R'; | |
output[3] ='O'; | |
}else{ | |
int thousand=input/1000; | |
int hundred=(input%1000)/100; | |
int ten=(input%100)/10; | |
int ones=input%10; | |
int i; | |
for(i=0; i<thousand; i++){ | |
output[i]='M'; | |
} | |
if(hundred==9){ | |
output[i++]='C'; | |
output[i++]='M'; | |
}else if (hundred==4){ | |
output[i++]='C'; | |
output[i++]='D'; | |
}else if(hundred>=5&&hundred<=8){ | |
for(int j=0; j<hundred-4;j++){ | |
if(j==0){output[i++]='D';} | |
else{output[i++]='C'; | |
} | |
} | |
}else if (hundred>=1&&hundred<=3){ | |
for(int j=0; j<hundred;j++){ | |
output[i++]='C'; | |
} | |
} | |
if(ten==9){ | |
output[i++]='X'; | |
output[i++]='C'; | |
}else if (ten==4){ | |
output[i++]='X'; | |
output[i++]='L'; | |
}else if(ten>=5&&ten<=8){ | |
for(int j=0; j<ten-4;j++){ | |
if(j==0){output[i++]='L';} | |
else{output[i++]='X'; | |
} | |
} | |
}else if (ten>=1&&ten<=3){ | |
for(int j=0; j<ten;j++){ | |
output[i++]='X'; | |
} | |
} | |
if(ones==9){ | |
output[i++]='I'; | |
output[i++]='X'; | |
}else if (ones==4){ | |
output[i++]='I'; | |
output[i++]='V'; | |
}else if(ones>=5&&ones<=8){ | |
for(int j=0; j<ones-4;j++){ | |
if(j==0){output[i++]='V';} | |
else{output[i++]='I'; | |
} | |
} | |
}else if (ones>=1&&ones<=3){ | |
for(int j=0; j<ones;j++){ | |
output[i++]='I'; | |
} | |
} | |
} | |
return 0; | |
} | |
int main(){ | |
char a[20],b[20]; | |
int answer; | |
while(cin >> a ){ | |
if(a[0] =='#'){ | |
break; | |
} | |
cin >> b; | |
char c[20]={0}; | |
int num1=rome_to_num(a); | |
int num2=rome_to_num(b); | |
//cout << num1 <<" " <<num2 << endl; | |
if(num1>num2){ | |
answer=num1-num2; | |
}else{answer=num2-num1;} | |
//cout << answer << endl; | |
num_to_rome(answer,c); | |
cout << c; | |
cout << endl; | |
} | |
return 0; | |
} |
沒有留言:
張貼留言