網頁

2015年7月13日 星期一

Zerojudge a013 羅馬數字

以下是七個基本的羅馬數字︰

羅馬數字數目
I1
V5
X10
L50
C100
D500
M1,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

以下為程式碼:
#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;
}


沒有留言:

張貼留言