题目描述
小明非常高兴你能帮他处理那些罗马数字,他想学着自己写罗马数字,但是他不知道自己到底写对了没有。 请你帮他写个程序,能正确地将10进制数字转换成罗马数字,以便他能进行核对。 罗马数字是使用字母组合表示数字的。不同的字母表示的值如下表:
字母 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
表示规则如下:
- 数字的值是为所有字母的值的和。比如说II=2,XIII=13
- 没有0,比如207使用两个100,1个5,2个1表示,即CCVII
- 字母应该按值的降序从左到右排列,但为了避免太多的重复(比如IIII),使用减法来缩短式子
- 使用I在V和X前,表示4(IV)和9(IX)
- 使用X在L和C前,表示40(XL)和90(XC)
- 使用C在D和M前,表示400(CD)和900(CM)
输入
每行输入一个整数n,1≤n≤10,000。
输出
每行输出对应十进制整数的罗马数字。
样例输入
1 2 3 4 9999 10000
样例输出
I II III IV MMMMMMMMMCMXCIX MMMMMMMMMM
思路的话我觉得就是先从输出M开始考虑。
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)&&n>0)
{
while(n>=1000)//从最高位开始判断
{
n-=1000;
printf("M");
}//从这个循环跳出来之后n的值也发生了变化,可以继续下面的循环,下面的同理
while(n>=900)
{
n-=900;
printf("CM");
}
while(n>=500)//注意循环的先后顺序
{
n-=500;
printf("D");
}
while(n>=400)
{
n-=400;
printf("CD");
}
while(n>=100)
{
n-=100;
printf("C");
}
while(n>=90)
{
n-=90;
printf("XC");
}
while(n>=50)
{
n-=50;
printf("L");
}
while(n>=40)
{
n-=40;
printf("XL");
}
while(n>=10)
{
n-=10;
printf("X");
}
while(n>=9)
{
n-=9;
printf("IX");
}
while(n>=5)
{
n-=5;
printf("V");
}
while(n>=4)
{
n-=4;
printf("IV");
}
while(n>=1)
{
n-=1;
printf("I");
}
puts("");
}
return 0;
}