古罗马的加法
2016-05-04 20:44
369 查看
问题描述
小明是一个程序员,他最近对罗马数字很感兴趣,决定写一个罗马数字的a+b程序。
罗马数字规则如下(来自维基百科):
罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。
重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同与阿拉伯数字每位数字分别表示。)
左减数字必须为一位,比如8写成VIII,而非IIX。
右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
一些例子如MDCCCLXXX表示1880,CXCIX表示199。点击这里查看更多例子。
输入包含两行,每行为一个只由上述7个字符组成的字符串,来表示一个不大于1000的罗马数字。
输出一行,如果输入的不能识别为合法的罗马数字,输出“Aha! I don't need to calculate the sum”。如果合法,则输出两个数字之和,结果用罗马数字来表示。
题解思路
大致思路:
用的比较麻烦的方法,整体思路就是先将罗马数字转化为阿拉伯数字,然后进行计算,最后再把结果转换为罗马数字。
具体实现:
如何将罗马数字转化为阿拉伯数字,我们可以采用直接加的方式,在读入字符的时候,如果当前字符所表示的数比该字符后面一个字符表示的数小的时候那么当前字符就取起所表示的数的负值,否则取其本身所表示的数,然后将这些书加起来就是转换后的阿拉伯数字。阿拉伯数字转化为罗马数字,我们可以按位进行转化,先转化千位的,然后再转化百位的,十位的,个位的,这里的转化可以找规律,如果找不到规律的话,可以讲所有的相应的表示方法列举出来,利用if语句即可完成。
注意事项:
(1)因为输入的罗马数组表示的数字的范围是不大于1000的,所以如果在转化的时候出现大于1000的数字那么就可以认为这个罗马数字是错误的。
(2)因为输入的罗马数字存在不合法的情况,所以需要先判断输入的罗马数字是否合法。具体判断方法就是先将该罗马数字转化为阿拉伯数字,然后再将这个阿拉伯数字转化为罗马数字看这两个罗马数字是否是一样的,如果是一样的则表示是正确的,如果是不一样的则表示是不正确的。
(3)注意需要将所有的情况都考虑完全。
实现代码
小明是一个程序员,他最近对罗马数字很感兴趣,决定写一个罗马数字的a+b程序。
罗马数字规则如下(来自维基百科):
罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。
重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同与阿拉伯数字每位数字分别表示。)
左减数字必须为一位,比如8写成VIII,而非IIX。
右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
一些例子如MDCCCLXXX表示1880,CXCIX表示199。点击这里查看更多例子。
输入包含两行,每行为一个只由上述7个字符组成的字符串,来表示一个不大于1000的罗马数字。
输出一行,如果输入的不能识别为合法的罗马数字,输出“Aha! I don't need to calculate the sum”。如果合法,则输出两个数字之和,结果用罗马数字来表示。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示 I↵ I↵ | 以文本方式显示 II↵ | 1秒 | 64M | 0 |
大致思路:
用的比较麻烦的方法,整体思路就是先将罗马数字转化为阿拉伯数字,然后进行计算,最后再把结果转换为罗马数字。
具体实现:
如何将罗马数字转化为阿拉伯数字,我们可以采用直接加的方式,在读入字符的时候,如果当前字符所表示的数比该字符后面一个字符表示的数小的时候那么当前字符就取起所表示的数的负值,否则取其本身所表示的数,然后将这些书加起来就是转换后的阿拉伯数字。阿拉伯数字转化为罗马数字,我们可以按位进行转化,先转化千位的,然后再转化百位的,十位的,个位的,这里的转化可以找规律,如果找不到规律的话,可以讲所有的相应的表示方法列举出来,利用if语句即可完成。
注意事项:
(1)因为输入的罗马数组表示的数字的范围是不大于1000的,所以如果在转化的时候出现大于1000的数字那么就可以认为这个罗马数字是错误的。
(2)因为输入的罗马数字存在不合法的情况,所以需要先判断输入的罗马数字是否合法。具体判断方法就是先将该罗马数字转化为阿拉伯数字,然后再将这个阿拉伯数字转化为罗马数字看这两个罗马数字是否是一样的,如果是一样的则表示是正确的,如果是不一样的则表示是不正确的。
(3)注意需要将所有的情况都考虑完全。
实现代码
#include<stdio.h> #include<string.h> 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\n"); } else { shu1=0; shu2=0; for(i=0;i<length1;i++) { if(a[i]=='I') { biaoshi[i].fuhao='I'; biaoshi[i].zhi=1; } if(a[i]=='V') { biaoshi[i].fuhao='V'; biaoshi[i].zhi=5; } if(a[i]=='X') { biaoshi[i].fuhao='X'; biaoshi[i].zhi=10; //continue; } if(a[i]=='L') { biaoshi[i].fuhao='L'; biaoshi[i].zhi=50; // continue; } if(a[i]=='C') { biaoshi[i].fuhao='C'; biaoshi[i].zhi=100; // continue; } if(a[i]=='D') { biaoshi[i].fuhao='D'; biaoshi[i].zhi=500; // continue; } if(a[i]=='M') { biaoshi[i].fuhao='M'; biaoshi[i].zhi=1000; // continue; } } for(i=0;i<length1;i++) { if(biaoshi[i].zhi>=biaoshi[i+1].zhi) { shu1+=biaoshi[i].zhi; } else { shu1-=biaoshi[i].zhi; } } for(i=0;i<length2;i++) { if(b[i]=='I') { biaoshi2[i].fuhao='I'; biaoshi2[i].zhi=1; // continue; } if(b[i]=='V') { biaoshi2[i].fuhao='V'; biaoshi2[i].zhi=5; // continue; } if(b[i]=='X') { biaoshi2[i].fuhao='X'; biaoshi2[i].zhi=10; // continue; } if(b[i]=='L') { biaoshi2[i].fuhao='L'; biaoshi2[i].zhi=50; // continue; } if(b[i]=='C') { biaoshi2[i].fuhao='C'; biaoshi2[i].zhi=100; // continue; } if(b[i]=='D') { biaoshi2[i].fuhao='D'; biaoshi2[i].zhi=500; // continue; } if(b[i]=='M') { biaoshi2[i].fuhao='M'; biaoshi2[i].zhi=1000; // continue; } } for(i=0;i<length2;i++) { if(biaoshi2[i].zhi>=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\n"); } 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\n",c); } else { printf("Aha! I don't need to calculate the sum\n"); } } } return 0; }
相关文章推荐
- 图片无限轮播
- 《linux命令》ps -aux详细解释
- BF算法的实现
- WebService学习总结(1)——通过jws:wsimoort工具调用第三方提供的webService服务
- hangman猜字游戏
- 最大子序列和最大子矩阵
- KMP算法的实现
- Android MVP模式
- 汇编语言跳转总结
- Treats for the Cows
- springMVC整合Freemarker
- 哈佛公开课 幸福课
- tableview重用和cell常见问题
- KMP算法的实现
- ns2 的安装
- 二叉树的线索化
- 转载:通俗理解遗传算法
- Java学习笔记之常用方法类(四)DecimalFormat类、Pattern与Match类
- 推导相机变换矩阵
- 剑指offer:删除链表中重复的结点