| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1143 人关注过本帖
标题:一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!
只看楼主 加入收藏
jiang5495
Rank: 1
等 级:新手上路
威 望:2
帖 子:296
专家分:0
注 册:2008-5-11
结帖率:100%
收藏
 问题点数:0 回复次数:4 
一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!
在古罗马数字中我们知道: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();
   }
搜索更多相关主题的帖子: 罗马数字 最大公约数 指教 XVI 
2008-05-13 17:25
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
不懂罗马文,对于罗马数字的进制更弄不明白了。
2008-05-13 19:42
jiang5495
Rank: 1
等 级:新手上路
威 望:2
帖 子:296
专家分:0
注 册:2008-5-11
收藏
得分:0 
补充
其实并不须要懂太多落马进制,先将其转换成整数,在把整数转换成罗马数字就可以了.
2008-05-13 20:50
zhuwei168
Rank: 1
来 自:东软信息学院
等 级:新手上路
帖 子:180
专家分:0
注 册:2008-2-13
收藏
得分:0 
不会
2008-05-14 18:06
jiang5495
Rank: 1
等 级:新手上路
威 望:2
帖 子:296
专家分:0
注 册:2008-5-11
收藏
得分:0 
问题我已解决
代码:
# 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();
   }
2008-05-15 20:43
快速回复:一个古罗马数字问题<罗马版的最大公约数问题>望各位高手多多指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026957 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved