#33802: C語言解法


dreamer.aeu65@gmail.com (Noah)

學校 : 國立清華大學
編號 : 173796
來源 : [140.114.216.100]
最後登入時間 :
2024-04-09 02:08:52
a013. 羅馬數字 -- NPSC 模擬試題 | From: [1.161.83.82] | 發表日期 : 2023-02-03 19:57

#include<stdio.h>
#include<string.h>
int main() {
    while(1) {
        char test[10];
        scanf("%s",test);
        if(test[0]=='#') /*如果偵測到#,則終止輸入*/
            break;
        else {
            int num1=0,num2=0,num3=0; /*!因為有多組輸入,要在迴圈內重新指派值(歸零),覆蓋前一次運算留下的殘值*/
            char rome1[11]={},rome2[10]={},rome3[20]={},output[10]={};
            strcpy(rome1,test);
            scanf("%s",rome2);

            int i=0;
            while(rome1[i]!='\0'&&rome1[i]!='\n') { /*將第一筆輸入的羅馬數字轉為阿拉伯數字,以方便運算*/
                switch(rome1[i]) {
                    case 'I': {
                        if(rome1[i+1]=='V') {
                            num1+=4;
                            i+=2;
                        }
                        else if(rome1[i+1]=='X') {
                            num1+=9;
                            i+=2;
                        }
                        else {
                            num1+=1;
                            i++;
                        }
                        break;
                    }
                    case 'V': {
                        num1+=5;
                        i++;
                        break;
                    }
                    case 'X': {
                        if(rome1[i+1]=='L') {
                            num1+=40;
                            i+=2;
                        }
                        else if(rome1[i+1]=='C') {
                            num1+=90;
                            i+=2;
                        }
                        else {
                            num1+=10;
                            i++;
                        }
                        break;
                    }
                    case 'L': {
                        num1+=50;
                        i++;
                        break;
                    }
                    case 'C': {
                        if(rome1[i+1]=='D') {
                            num1+=400;
                            i+=2;
                        }
                        else if(rome1[i+1]=='M') {
                            num1+=900;
                            i+=2;
                        }
                        else {
                            num1+=100;
                            i++;
                        }
                        break;
                    }
                    case 'D': {
                        num1+=500;
                        i++;
                        break;
                    }
                    case 'M': {
                        num1+=1000;
                        i++;
                        break;
                    }
                }
            }

            i=0;
            while(rome2[i]!='\0'&&rome2[i]!='\n') { /*將第二筆輸入的羅馬數字轉為阿拉伯數字,以方便運算*/
                switch(rome2[i]) {
                    case 'I': {
                        if(rome2[i+1]=='V') {
                            num2+=4;
                            i+=2;
                        }
                        else if(rome2[i+1]=='X') {
                            num2+=9;
                            i+=2;
                        }
                        else {
                            num2+=1;
                            i++;
                        }
                        break;
                    }
                    case 'V': {
                        num2+=5;
                        i++;
                        break;
                    }
                    case 'X': {
                        if(rome2[i+1]=='L') {
                            num2+=40;
                            i+=2;
                        }
                        else if(rome2[i+1]=='C') {
                            num2+=90;
                            i+=2;
                        }
                        else {
                            num2+=10;
                            i++;
                        }
                        break;
                    }
                    case 'L': {
                        num2+=50;
                        i++;
                        break;
                    }
                    case 'C': {
                        if(rome2[i+1]=='D') {
                            num2+=400;
                            i+=2;
                        }
                        else if(rome2[i+1]=='M') {
                            num2+=900;
                            i+=2;
                        }
                        else {
                            num2+=100;
                            i++;
                        }
                        break;
                    }
                    case 'D': {
                        num2+=500;
                        i++;
                        break;
                    }
                    case 'M': {
                        num2+=1000;
                        i++;
                        break;
                    }
                }
            }

            if(num1>=num2) /*根據題目要求,如果被減數比減數小,則輸出差的絕對值*/
                num3=num1-num2;
            else
                num3=num2-num1;

            if(num3==0) /*如果相減後的差為零,則輸出「ZERO」*/
                printf("ZERO\n");
            else { /*如果相減後的差不為零,則轉為羅馬數字後再輸出*/
                int j=0;
                while(num3>=1000) {
                    rome3[j]='M';
                    num3-=1000;
                    j++;
                }
                while(num3>=500) {
                    rome3[j]='D';
                    num3-=500;
                    j++;
                }
                while(num3>=100) {
                    rome3[j]='C';
                    num3-=100;
                    j++;
                }
                while(num3>=50) {
                    rome3[j]='L';
                    num3-=50;
                    j++;
                }
                while(num3>=10) {
                    rome3[j]='X';
                    num3-=10;
                    j++;
                }
                while(num3>=5) {
                    rome3[j]='V';
                    num3-=5;
                    j++;
                }
                while(num3>=1) {
                    rome3[j]='I';
                    num3-=1;
                    j++;
                }

                int k=0;
                for(i=0;rome3[i]!='\0';i++) { /*在羅馬數字的表示法中,不會有4個相同符號並列。若有,則必須依照羅馬數字的表示法轉換再輸出*/
                    if(rome3[i]==rome3[i+1]&&rome3[i+1]==rome3[i+2]&&rome3[i+2]==rome3[i+3]) {
                        switch(rome3[i]) {
                            case 'C': {
                                if(rome3[i-1]=='D') {
                                    output[k-1]='C';
                                    output[k]='M';
                                }
                                else {
                                    output[k]='C';
                                    output[k+1]='D';
                                    k++;
                                }
                                break;
                            }
                            case 'X': {
                                if(rome3[i-1]=='L') {
                                    output[k-1]='X';
                                    output[k]='C';
                                }
                                else {
                                    output[k]='X';
                                    output[k+1]='L';
                                    k++;
                                }
                                break;
                            }
                            case 'I': {
                                if(rome3[i-1]=='V') {
                                    output[k-1]='I';
                                    output[k]='X';
                                }
                                else {
                                    output[k]='I';
                                    output[k+1]='V';
                                    k++;
                                }
                                break;
                            }
                        }
                        i+=3;
                    }
                    else
                        output[k]=rome3[i];
                    k++; /*!k++寫在前面的話,k值會先+1再做運算,也就是說k值會從1開始,output[0]沒有東西*/
                }

                for(i=0;output[i]=='I'||output[i]=='V'||output[i]=='X'||output[i]=='L'||output[i]=='C'||output[i]=='D'||output[i]=='M'||output[i]=='\n';i++)
                /*這句是為了避免輸出後面多一坨不乾淨的東西*/
                    printf("%c",output[i]);
                printf("\n");
            }
        }
    }
    return 0;
}

 

 
ZeroJudge Forum