比起暴力破解法,這個方法可能更嚴謹一點,不過我也不敢說是最好的方法,我就分享一下我用的函式。
首先是處理輸入的函式:
int convertInput(char input[])
{
int value=0;
for(int i=strlen(input)-1;i>=0;i--)
{
if(input[i]=='I') //是I的話,檢查右邊有沒有X或V
{
if(input[i+1]=='X')
value--;
else if(input[i+1]=='V')
value--;
else
value++;
}
else if(input[i]=='V')
value+=5;
else if(input[i]=='X') //是X的話,檢查右邊有沒有C或L
{
if(input[i+1]=='C')
value-=10;
else if(input[i+1]=='L')
value-=10;
else
value+=10;
}
else if(input[i]=='L')
value+=50;
else if(input[i]=='C') //是C的話,檢查右邊有沒有M或D
{
if(input[i+1]=='M')
value-=100;
else if(input[i+1]=='D')
value-=100;
else
value+=100;
}
else if(input[i]=='D')
value+=500;
else if(input[i]=='M')
value+=1000;
}
return value;
}
(沒註解就是正常處理。)
因為會有例外的只有I,X,C,所以只要針對這三個去做前後判斷就好了 (加減不會存在跨位,只會發生在前後一位),這裡我是用右到左,小到大的方法。
再來是用來轉換輸出的函式:
void convertOutput(int value)
{
while(value>0)
{
for(int i=0;i<value/1000;i++) //確認M的數量
printf("M");
value%=1000;
if(value/900==1) //確認CM的數量
printf("CM");
value%=900;
for(int i=0;i<value/500;i++) //確認D的數量
printf("D");
value%=500;
if(value/400==1) //確認CD的數量
printf("CD");
value%=400;
for(int i=0;i<value/100;i++) //確認C的數量
printf("C");
value%=100;
if(value/90==1) //確認XC的數量
printf("XC");
value%=90;
for(int i=0;i<value/50;i++) //確認L的數量
printf("L");
value%=50;
if(value/40==1) //確認XL的數量
printf("XL");
value%=40;
for(int i=0;i<value/10;i++) //確認X的數量
printf("X");
value%=10;
if(value/9==1) //確認IX的數量
printf("IX");
value%=9;
for(int i=0;i<value/5;i++) //確認V的數量
printf("V");
value%=5;
if(value/4==1) //確認IV的數量
printf("IV");
value%=4;
for(int i=0;i<value/1;i++) //確認I的數量
printf("I");
value%=1;
}
printf("\n");
}
這裡我用void函式直接輸出,直接把絕對值丟進去跑就好了,處理就秉持一個從大到小的原則 (輸出要記得CM,CD,XC之類的要分開)。
再來就是主函式:
int main()
{
int value1,value2;
char input1[20],input2[20];
while(scanf("%s",input1)!=EOF)
{
if(input1[0]=='#')
break;
scanf(" %s",input2);
value1=convertInput(input1);
value2=convertInput(input2);
if(value1>value2)
{
int sum=value1-value2;
convertOutput(sum);
}
else if(value1<value2)
{
int sum=value2-value1;
convertOutput(sum);
}
else if(value1==value2)
printf("ZERO\n");
}
}
用了函式後的主函式真的精簡很多,而且交給函式處理比較不會有衝突的問題,推推。