初来乍到
初来乍到
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 201 | Accepted: 72 |
Sample Input
1 10 35 99 400
Sample Output
1=I 10=X 35=XXXV 99=XCIX 400=CD
解析:
思路:做这道题时,我用到了罗马数字和阿拉伯数的在线转换,分析多个数的组成方式。根据多个数的组成方式可有: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; }
浙公网安备 33010602011771号