学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
发新话题
打印

一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!

一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!

在古罗马数字中我们知道: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();
   }

TOP

不懂罗马文,对于罗马数字的进制更弄不明白了。

TOP

补充

其实并不须要懂太多落马进制,先将其转换成整数,在把整数转换成罗马数字就可以了.

TOP

不会

TOP

问题我已解决

代码:
# 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
  {*s=*s-1;
  return 'I';}
  }

  void main()
  {
  char a[N],b[N],c[N]={0};
  int s1=0,s2=0,s,i,r=0,z=1,t;
  printf("Please enter two rome number:\n");
  scanf("%s",a);

  scanf("%s",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]);
   }
      printf("%d\n",s1);
   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]);
    }
  printf("%d\n",s2);
    if(s2>s1)
    {
    t=s2;
    s2=s1;
    s1=t;
    }

   while(z!=0)
   {
   z=s1%s2;
   s1=s2;
   s2=z;
   }
   s=s1;
   printf("%d\n",s);


   while(s>=1)
   {
   c[r]=rechange(&s);
   r++;
   }
   puts(c);
   getch();
   }

TOP

发新话题