链接
1217
题目
题目描述
小明非常高兴你能帮他处理那些罗马数字,他想学着自己写罗马数字,但是他不知道自己到底写对了没有。 请你帮他写个程序,能正确地将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 MMMMMMMMMMd
代码
#include<iostream>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
//1,5,10,50,100,500,1000
//I,V, X, L, C, D, M
//4, 9, 40,90, 400, 900
//IV,IX, XL,XC, CD, CM
if(n/1000>0)
{
int q=n/1000;
for(int i=0;i<q;i++)
printf("M");
n%=1000;
}
if(n/900>0)
{
int q=n/900;
for(int i=0;i<q;i++)
printf("CM");
n%=900;
}
if(n/500>0)
{
int q=n/500;
for(int i=0;i<q;i++)
printf("D");
n%=500;
}
if(n/400>0)
{
int q=n/400;
for(int i=0;i<q;i++)
printf("CD");
n%=400;
}
if(n/100)
{
int q=n/100;
for(int i=0;i<q;i++)
printf("C");
n%=100;
}
if(n/90)
{
int q=n/90;
for(int i=0;i<q;i++)
printf("XC");
n%=90;
}
if(n/50)
{
int q=n/50;
for(int i=0;i<q;i++)
printf("L");
n%=50;
}
if(n/40)
{
int q=n/40;
for(int i=0;i<q;i++)
printf("XL");
n%=40;
}
if(n/10)
{
int q=n/10;
for(int i=0;i<q;i++)
printf("X");
n%=10;
}
if(n/9)
{
int q=n/9;
for(int i=0;i<q;i++)
printf("IX");
n%=9;
}
if(n/5)
{
int q=n/5;
for(int i=0;i<q;i++)
printf("V");
n%=5;
}
if(n/4)
{
int q=n/4;
for(int i=0;i<q;i++)
printf("IV");
n%=4;
}
for(int i=0;i<n;i++)
printf("I");
printf("\n");
}
return 0;
}
总结
1.没有想到是一个考察耐心的题目,硬是写了116行
2.首先把每一种情况的罗马数字写出来,就像我在代码里面注释的那样
3.然后就是从大到小,分情况罗列,整除是向下取整,把我们输入的数字除以这些数字
//1,5,10,50,100,500,1000
//I,V, X, L, C, D, M
//4, 9, 40,90, 400, 900
//IV,IX, XL,XC, CD, CM
把这个数字保存下来,表示循环的次数,设置一个循环输出罗马数字,然后在循环外面把高位去掉(取模运算),把低位去掉是除法