#25419: C++土法解題


720222@csc.pjhs.tyc.edu.tw (暗夜)

學校 : 不指定學校
編號 : 154378
來源 : [182.233.186.69]
最後登入時間 :
2024-01-05 15:16:04
a013. 羅馬數字 -- NPSC 模擬試題 | From: [36.228.54.236] | 發表日期 : 2021-05-20 13:17

/*規則

'I'=1,'V'=5,'X'=10,'L'=50,'C'=100,'D'=500,'M'=1000

  • 右加左減:
    • 在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
    • 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。
    • 左減的數字有限制,僅限於Ⅰ、Ⅹ、Ⅽ。比如45是ⅩⅬⅤ,不用ⅤⅬ。
    • 但是,左減時不可跨越一個位值。比如,99是ⅩⅭⅨ({\displaystyle [100-10]+[10-1]}[100-10]+[10-1]),不用ⅠⅭ({\displaystyle 100-1}100-1)。(等同於阿拉伯數字每位數字分別表示。)
    • 左減數字必須為一位,比如8是Ⅷ,不用ⅡⅩ。
    • 右加數字不連續超過三位,比如14是ⅪⅤ,不用ⅪⅢ。(只有'I'=1,'X'=10,'C'=100,'M'=1000可重複)

注意   900='C''M',90 ='X''C',9 ='I''X'    400 ='C''D',40 ='X''L',4 ='I''V'

 

*/ 

下為解答

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include<iostream>

#include<cstring>

using namespace std;

 

int main()

{

    string a,b=b+'#',c;

    while (cin>>a)

    {

        if (a.at(0)=='#')

            break;

        cin>>b;

        c.clear();

        int sum1=0,sum2=0,A[a.length()],B[b.length()],sum3=0;

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

            if(a.at(i)=='M')

                A[i]=1000;

            else if(a.at(i)=='D')

                A[i]=500;

            else if(a.at(i)=='C')

                A[i]=100;

            else if(a.at(i)=='L')

                A[i]=50;

            else if(a.at(i)=='X')

                A[i]=10;

            else if(a.at(i)=='V')

                A[i]=5;

            else if(a.at(i)=='I')

                A[i]=1;

        for (int i=0; i<b.length(); i++)

            if(b.at(i)=='M')

                B[i]=1000;

            else if(b.at(i)=='D')

                B[i]=500;

            else if(b.at(i)=='C')

                B[i]=100;

            else if(b.at(i)=='L')

                B[i]=50;

            else if(b.at(i)=='X')

                B[i]=10;

            else if(b.at(i)=='V')

                B[i]=5;

            else if(b.at(i)=='I')

                B[i]=1;

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

            sum1=sum1+A[i];

        for (int i=0; i<b.length(); i++)

            sum2=sum2+B[i];

        for (int i=0; i<a.length()-1; i++)

            if (A[i]<A[i+1])

                sum1=sum1-2*A[i];

        for (int i=0; i<b.length()-1; i++)

            if (B[i]<B[i+1])

                sum2=sum2-2*B[i];

        sum3=sum1-sum2;

        if(sum3<0)

            sum3=-sum3;

        while (sum3>=1000)

        {

            c=c+'M';

            sum3=sum3-1000;

        }

        if (sum3>=900)

        {

            c=c+'C';

            c=c+'M';

            sum3=sum3-900;

        }

        if (sum3>=500)

        {

            c=c+'D';

            sum3=sum3-500;

        }

        if (sum3>=400)

        {

            c=c+'C';

            c=c+'D';

            sum3=sum3-400;

        }

        while (sum3>=100)

        {

            c=c+'C';

            sum3=sum3-100;

        }

        if (sum3>=90)

        {

            c=c+'X';

            c=c+'C';

            sum3=sum3-90;

        }

        if (sum3>=50)

        {

            c=c+'L';

            sum3=sum3-50;

        }

        if (sum3>=40)

        {

            c=c+'X';

            c=c+'L';

            sum3=sum3-40;

        }

        while (sum3>=10)

        {

            c=c+'X';

            sum3=sum3-10;

        }

        if (sum3>=9)

        {

            c=c+'I';

            c=c+'X';

            sum3=sum3-9;

        }

        if (sum3>=5)

        {

            c=c+'V';

            sum3=sum3-5;

        }

        if (sum3>=4)

        {

            c=c+'I';

            c=c+'V';

            sum3=sum3-4;

        }

        while (sum3>=1)

        {

            c=c+'I';

            sum3=sum3-1;

        }

        if(c.length()==0)

            cout<<"ZERO"<<endl;

        else

            cout<<c<<endl;

 

    }

}

 
ZeroJudge Forum