一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!
在古罗马数字中我们知道:I表示1, V表示5; X表示10; L表示50;C表示100, D表示500; M表示1000;
现在以这七个数为基数,表示一切3000以内的数;
要求:从键盘输入两个罗马数字,从屏幕输出他们的最大公约数(也要以罗马数字的形式;)
输入举例:XVI XXIV
输出举例: VIII
补充说明:大家都知道如果同样的字符出现次数超过四次要进为如:IIII要写成IV;
还有IV表示4,VI表示6;这大家应该清楚.
望各位高手多多指教!
下面是我对这个问题的实现,既冗长又不能大到目的.
我想大家肯定能有更好的方法,教教我!
# include<stdio.h>
# include<string.h>
# define N 10
int change(char ch)
{
if(ch=='I') return 1;
if(ch=='V') return 5;
if(ch=='X') return 10;
if(ch=='L') return 50;
if(ch=='C') return 100;
if(ch=='D') return 500;
if(ch=='M') return 1000;
}
char rechange(int* s)
{
if(*s>=1000)
{
*s=*s-1000;
return 'M';}
else if(*s>=500)
{
*s=*s-500;
return 'D';}
else if(*s>=100)
{
*s=*s-100;
return 'C';}
else if(*s>=50)
{
*s=*s-50;
return 'L';}
else if(*s>=10)
{
*s=*s-10;
return 'X';}
else if(*s>=5)
{
*s=*s-5;
return 'V';
}
else
return 'I';
}
void main()
{
char a[N],b[N],c[N];
int s1=0,s2=0,s,i,r=0,z=1,t;
printf("Please enter two rome number:\n");
gets(a);
getchar();
gets(b);
for(i=0;a[i]!='\0';i++)
{
if(change(a[i])>=change(a[i+1])||a[i+1]=='\0')
s1=s1+change(a[i]);
else
s1=s1-change(a[i]);
}
for(i=0;b[i]!='\0';i++)
{
if(change(b[i])>=change(b[i+1])||b[i+1]=='\0')
s2=s2+change(b[i]);
else
s2=s2-change(b[i]);
}
if(s2>s1)
{
t=s2;
s2=s1;
s1=t;
}
while(z!=0)
{
z=s1%s2;
s1=s2;
s2=z;
}
s=s1;
while(s>=1)
{
c[r]=rechange(&s);
r++;
}
puts(c);
getch();
}