古代ローマの足し算
6102 ワード
問題の説明
明ちゃんはプログラマーで、最近ローマ数字に興味を持って、ローマ数字のa+bプログラムを書くことにしました.
ローマ数字のルールは次のとおりです(ウィキペディアより):
ローマ数字は全部で7つあり、すなわち、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)である.任意の正の整数を下記の規則で表すことができる.なお、ローマ数字には「0」はない、キャリー制とは関係ありません.数回繰り返す:1つのローマ数字が数回繰り返されると、この数の数の数倍を表します.右プラス左マイナス:大きなローマ数字の右に小さいローマ数字を記入し、大きな数字に小さい数字を加えることを示します.大きなローマ数字の左側に小さいローマ数字を記入し、大きな数字が数字を減らすことを示します.左マイナスの数字には制限があり、I、X、Cに限られています.例えば45はVLではなくXLVでしか書けませんが、左マイナスでは1桁を越えてはいけません.たとえば、99はIC(100−1)で表すのではなく、XCIX([100−10]+[10−1])で表す.(アラビア数字の1桁ごとに表示されるのと同じ.)左マイナス数字は1桁でなければならない.例えば8はIIXではなくVIIIと書く.右プラス数字は3桁を連続的に超えてはならない.例えば14はXIIIではなくXIVと書く.一部の例はMDCCCLXXXが1880を表し、CXCIXが199を表す.ここをクリックしてより多くの例を見る.
入力には、行ごとに上記の7文字のみからなる文字列が2行あり、1000未満のローマ数字を表します.
行を出力し、入力されたローマ数字が合法と認識されない場合は「Aha!I don't need to calculate the sum」を出力します.合法的であれば、2つの数字の和を出力し、結果はローマ数字で表されます.
テスト入力
期待出力
時間の制限
メモリ制限
追加プロセス
試験例1
テキスト表示
I↵
I↵
テキスト表示
II↵
1秒
64M
0
構想を解く.
大まかな考え方:
面倒な方法では、ローマ数字をアラビア数字に変換して計算し、結果をローマ数字に変換するのが全体的な考え方です.
具体的な実装:
ローマ数字をアラビア数字に変換するには、文字を読み込むときに、現在の文字が表す数がその文字の後ろの文字が表す数より小さい場合、現在の文字は表す数の負の値を取り、そうでなければそれ自体が表す数を取ります.これらの本を合わせると、変換されたアラビア数字になります.アラビア数字はローマ数字に転化して、私达は位によって転化することができて、先に千位のを転化して、それから百位の、10位の、個位の、ここの転化は法則を探すことができて、もし法則が見つからないならば、すべての相応の表現方法を言って列挙することができて、if文を利用して完成することができます.
注意事項:
(1)入力されたローマ配列が示す数字の範囲は1000以下であるため,変換時に1000以上の数字が現れると,このローマ数字は誤りであると考えられる.
(2)入力されたローマ数字に不正があるため、入力されたローマ数字が正当か否かを判断する必要がある.具体的な判断方法としては、まずこのローマ数字をアラビア数字に変換してから、このアラビア数字をローマ数字に変換して、この2つのローマ数字が同じかどうかを見て、同じであれば正しく、異なるの場合は正しくありません.
(3)すべての状況を完全に考慮する必要があることに注意する.
インプリメンテーションコード
明ちゃんはプログラマーで、最近ローマ数字に興味を持って、ローマ数字のa+bプログラムを書くことにしました.
ローマ数字のルールは次のとおりです(ウィキペディアより):
ローマ数字は全部で7つあり、すなわち、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)である.任意の正の整数を下記の規則で表すことができる.なお、ローマ数字には「0」はない、キャリー制とは関係ありません.数回繰り返す:1つのローマ数字が数回繰り返されると、この数の数の数倍を表します.右プラス左マイナス:大きなローマ数字の右に小さいローマ数字を記入し、大きな数字に小さい数字を加えることを示します.大きなローマ数字の左側に小さいローマ数字を記入し、大きな数字が数字を減らすことを示します.左マイナスの数字には制限があり、I、X、Cに限られています.例えば45はVLではなくXLVでしか書けませんが、左マイナスでは1桁を越えてはいけません.たとえば、99はIC(100−1)で表すのではなく、XCIX([100−10]+[10−1])で表す.(アラビア数字の1桁ごとに表示されるのと同じ.)左マイナス数字は1桁でなければならない.例えば8はIIXではなくVIIIと書く.右プラス数字は3桁を連続的に超えてはならない.例えば14はXIIIではなくXIVと書く.一部の例はMDCCCLXXXが1880を表し、CXCIXが199を表す.ここをクリックしてより多くの例を見る.
入力には、行ごとに上記の7文字のみからなる文字列が2行あり、1000未満のローマ数字を表します.
行を出力し、入力されたローマ数字が合法と認識されない場合は「Aha!I don't need to calculate the sum」を出力します.合法的であれば、2つの数字の和を出力し、結果はローマ数字で表されます.
テスト入力
期待出力
時間の制限
メモリ制限
追加プロセス
試験例1
テキスト表示
I↵
I↵
テキスト表示
II↵
1秒
64M
0
構想を解く.
大まかな考え方:
面倒な方法では、ローマ数字をアラビア数字に変換して計算し、結果をローマ数字に変換するのが全体的な考え方です.
具体的な実装:
ローマ数字をアラビア数字に変換するには、文字を読み込むときに、現在の文字が表す数がその文字の後ろの文字が表す数より小さい場合、現在の文字は表す数の負の値を取り、そうでなければそれ自体が表す数を取ります.これらの本を合わせると、変換されたアラビア数字になります.アラビア数字はローマ数字に転化して、私达は位によって転化することができて、先に千位のを転化して、それから百位の、10位の、個位の、ここの転化は法則を探すことができて、もし法則が見つからないならば、すべての相応の表現方法を言って列挙することができて、if文を利用して完成することができます.
注意事項:
(1)入力されたローマ配列が示す数字の範囲は1000以下であるため,変換時に1000以上の数字が現れると,このローマ数字は誤りであると考えられる.
(2)入力されたローマ数字に不正があるため、入力されたローマ数字が正当か否かを判断する必要がある.具体的な判断方法としては、まずこのローマ数字をアラビア数字に変換してから、このアラビア数字をローマ数字に変換して、この2つのローマ数字が同じかどうかを見て、同じであれば正しく、異なるの場合は正しくありません.
(3)すべての状況を完全に考慮する必要があることに注意する.
インプリメンテーションコード
#include
#include
char a1[20],b1[20],c[20];
void zhuanhua(int x,char *y)
{
int i,k;
for(i=0,k=0;i<4;i++)
{
if(i==0&&(x/1000)==1)
{
y[k]='M';
k++;
x%=1000;
}
if(i==0&&(x/1000)==2)
{
y[k]='M';
y[k+1]='M';
k=k+2;
x%=1000;
}
if(i==1&&(x/100)==1)
{
y[k]='C';
k++;
x%=100;
}
if(i==1&&(x/100)==2)
{
y[k]='C';
y[k+1]='C';
k=k+2;
x%=100;
}
if(i==1&&(x/100)==3)
{
y[k]='C';
y[k+1]='C';
y[k+2]='C';
k=k+3;
x%=100;
}
if(i==1&&(x/100)==4)
{
y[k]='C';
y[k+1]='D';
k=k+2;
x%=100;
}
if(i==1&&(x/100)==5)
{
y[k]='D';
k++;
x%=100;
}
if(i==1&&(x/100)==6)
{
y[k]='D';
y[k+1]='C';
k=k+2;
x%=100;
}
if(i==1&&(x/100)==7)
{
y[k]='D';
y[k+1]='C';
y[k+2]='C';
k=k+3;
x%=100;
}
if(i==1&&(x/100)==8)
{
y[k]='D';
y[k+1]='C';
y[k+2]='C';
y[k+3]='C';
k=k+4;
x%=100;
}
if(i==1&&(x/100)==9)
{
y[k]='C';
y[k+1]='M';
k=k+2;
x%=100;
}
if(i==2&&(x/10)==1)
{
y[k]='X';
k++;
x%=10;
}
if(i==2&&(x/10)==2)
{
y[k]='X';
y[k+1]='X';
k=k+2;
x%=10;
}
if(i==2&&(x/10)==3)
{
y[k]='X';
y[k+1]='X';
y[k+2]='X';
k=k+3;
x%=10;
}
if(i==2&&(x/10)==4)
{
y[k]='X';
y[k+1]='L';
k=k+2;
x%=10;
}
if(i==2&&(x/10)==5)
{
y[k]='L';
k++;
x%=10;
}
if(i==2&&(x/10)==6)
{
y[k]='L';
y[k+1]='X';
k=k+2;
x%=10;
}
if(i==2&&(x/10)==7)
{
y[k]='L';
y[k+1]='X';
y[k+2]='X';
k=k+3;
x%=10;
}
if(i==2&&(x/10)==8)
{
y[k]='L';
y[k+1]='X';
y[k+2]='X';
y[k+3]='X';
k=k+4;
x%=10;
}
if(i==2&&(x/10)==9)
{
y[k]='X';
y[k+1]='C';
k=k+2;
x%=10;
}
if(i==3&&x==1)
{
y[k]='I';
k++;
}
if(i==3&&x==2)
{
y[k]='I';
y[k+1]='I';
k=k+2;
}
if(i==3&&x==3)
{
y[k]='I';
y[k+1]='I';
y[k+2]='I';
k=k+3;
}
if(i==3&&x==4)
{
y[k]='I';
y[k+1]='V';
k=k+2;
}
if(i==3&&x==5)
{
y[k]='V';
k++;
}
if(i==3&&x==6)
{
y[k]='V';
y[k+1]='I';
k=k+2;
}
if(i==3&&x==7)
{
y[k]='V';
y[k+1]='I';
y[k+2]='I';
k=k+3;
}
if(i==3&&x==8)
{
y[k]='V';
y[k+1]='I';
y[k+2]='I';
y[k+3]='I';
k=k+4;
}
if(i==3&&x==9)
{
y[k]='I';
y[k+1]='X';
k=k+2;
}
}
}
struct node
{
int zhi;
char fuhao;
}biaoshi[13];
struct node2
{
int zhi;
char fuhao;
}biaoshi2[13];
int main()
{
int length1,length2,shu1,shu2,shu;
char a[100],b[100];
int i;
scanf("%s",a);
scanf("%s",b);
length1=strlen(a);
length2=strlen(b);
if(length1>12||length2>12)
{
printf("Aha! I don't need to calculate the sum
");
}
else
{
shu1=0;
shu2=0;
for(i=0;i=biaoshi[i+1].zhi)
{
shu1+=biaoshi[i].zhi;
}
else
{
shu1-=biaoshi[i].zhi;
}
}
for(i=0;i=biaoshi2[i+1].zhi)
{
shu2+=biaoshi2[i].zhi;
}
else
{
shu2-=biaoshi2[i].zhi;
}
}
if(shu1>1000||shu2>1000)
{
printf("Aha! I don't need to calculate the sum
");
}
else
{
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
zhuanhua(shu1,a1);
zhuanhua(shu2,b1);
if(strcmp(a1,a)==0&&strcmp(b1,b)==0)
{
shu=shu1+shu2;
zhuanhua(shu,c);
printf("%s
",c);
}
else
{
printf("Aha! I don't need to calculate the sum
");
}
}
}
return 0;
}