初来乍到

初来乍到

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   201       Accepted:   72

 

Description
小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数.

 

Input
N行数据,每行一个满足0 < n <= 1000的数;结束以EOF判断

 

Output
每行一个,见输出示例

 

Sample Input

 

1 
10 
35 
99 
400

 

Sample Output

 

1=I
10=X
35=XXXV
99=XCIX
400=CD

 

Hint
基本数字:
I:一   V:五   X:十   L:五十   C:一百   D:五百   M:一千
记数方法
  (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如: Ⅲ = 3;
  (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
  (3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ = 4;Ⅸ = 9;
  (4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如:Ⅻ = 12 000 。
编辑本段
组数规则
  (1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
  (2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
  (3)V 和 X 左边的小数字只能用Ⅰ。
  (4)L 和 C 左边的小数字只能用×。
  (5)D 和 M 左 边的小数字只能用 C 。

 

 

解析:

思路:做这道题时,我用到了罗马数字和阿拉伯数的在线转换,分析多个数的组成方式。根据多个数的组成方式可有:1=I,2=II,3=III,4=IV,5=V,6=VI,7=VII,8=VIII,9=IX,10=X······其实后面的数都和1~9的形式一样,只需要分析每位的数值就行;下面是一些关键数值39=XXXIX,40=XL,49=XLIX,50=L,89=LXXXIX,90=XC······因此想399,499,899这几种数就是分界点;最后只需从首位递归下去就可以了,代码如下:

 

# include<stdio.h>
# include<math.h>
int sign[100],cnt;
char ch[8]={' ','I','X','C','M','V','L','D'};//这样排序的好处就是对应一个i,那么它的五倍就用i+4表示即可
void Judge(int num)
{
    int com=0,k=0,lp;
    int i;
    while(num>com)//k就是记录位数
    {
        com=10*com+9;
        k++;
    }
    lp=(int)pow((double)10,(double)(k-1));
    if(num<=4*lp-1)
    {
        for(i=1;i<=num/lp;i++)
           sign[cnt++]=ch[k];
    }
    else if(num<=5*lp-1)
    {
        sign[cnt++]=ch[k];
        sign[cnt++]=ch[k+4];
    }
    else if(num<=9*lp-1)
    {
        sign[cnt++]=ch[k+4];
        for(i=1;i<=num/lp-5;i++)
           sign[cnt++]=ch[k];
    }
    else 
    {
        sign[cnt++]=ch[k];
        sign[cnt++]=ch[k+1];
    }
    if(num%lp)
    Judge(num%lp);//用的就是对每一位进行判断,递归到底
}
int main()
{
    int num,i;
    while((scanf("%d",&num))!=EOF)
    {
        cnt=0;
        Judge(num);
        printf("%d=",num);
        for(i=0;i<cnt;i++)
            printf("%c",sign[i]);
        printf("\n");
    }
    return 0;
}

 

 

 

posted on 2013-03-07 20:02  即为将军  阅读(224)  评论(0)    收藏  举报

导航