古罗马的加法

问题描述


小明是一个程序员,他最近对罗马数字很感兴趣,决定写一个罗马数字的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”。如果合法,则输出两个数字之和,结果用罗马数字来表示。


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. I↵
  2. I↵
以文本方式显示
  1. 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;	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值