为了更好的阅读体检,可以查看我的算法学习博客罗马数字
题目内容
罗马数字是古罗马使用的记数系统,现今仍很常见。
罗马数字有七个基本符号: I,V,X,L,C,D,M。
罗马数字 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
对应的阿拉伯数字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
需要注意的是罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。按照下述的规则可以表示任意正整 数。
“标准”形式
重复次数:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:
-
1.在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
-
2.在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
-
3.左减的数字有限制,仅限于I,X,C.例如45表示XLV,而不是VL
-
4.左减时不可跨越一个位值。例如,99是XCIX
-
([100- 10]+ [10- 1]),而不是IC ([100 - 1])。等同于阿拉伯数字每位数字分别表示。
-
5.左减数字必须为一位,比如8是VIII,而不用IIX
-
6.罗马数字V,L,D中的任何一个放在较大的罗马数字右边只能使用一个。
-
7.右加连续相同数字不超过三位,比如14是XIV,而不是XIIII
现在给出一个阿拉伯数字表示的十进制正整数,输出其对应的罗马数字。
输入格式
一行十进制整数
输出格式
一行字符串,表示对应的罗马数字
样例
input
3
output
III
思路
这题最主要的难点就是规则繁杂。最快的理解规则方式是,先把1−101−10 都表示出来!
十进制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | I | II | III | IV | V | VI | VII | VIII | IX | X |
根据条件7,1,2,31,2,3 一定是 I,II,III
对于4,根据条件7,不能是IIII,所以根据条件2得到:IV. 对于9是同理的
I II III IV V VI VII VIII IX X
我们发现这样的规律很容易推广到10,20,...,100 与 100 , 200 , 300 , ... , 1000
十进制 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | X | XX | XXX | XL | L | LX | LXX | LXXX | XC | C |
十进制 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | C | CC | CCC | CD | D | DC | DCC | DCCC | CM | M |
有上面三张表,我们就可以表示出[1,1000] 内的任何一个数。只需要拆分十进制位即可。
例如:338=300+30+8。所以是CCCXXXVIII
实现
1.存表
2.将读入的数十进制拆分
3.查表输出
代码:
#include<bits/stdc++.h> using namespace std; string a[10000]; int main() { a[1] = "I"; a[2] = "II"; a[3] = "III"; a[4] = "IV"; a[5] = "V"; a[6] = "VI"; a[7] = "VII"; a[8] = "VIII"; a[9] = "IX"; a[10] = "X"; a[20] = "XX"; a[30] = "XXX"; a[40] = "XL"; a[50] = "L"; a[60] = "LX"; a[70] = "LXX"; a[80] = "LXXX"; a[90] = "XC"; a[100] = "C"; a[200] = "CC"; a[300] = "CCC"; a[400] = "CD"; a[500] = "D"; a[600] = "DC"; a[700] = "DCC"; a[800] = "DCCC"; a[900] = "CM"; a[1000] = "M"; int n; cin >> n; int x = n % 10; n -= x; int y = n % 100; n -= y; int z = n; cout << a[z] + a[y] + a[x] << endl; return 0; }
思路
这题最主要的难点就是规则繁杂。最快的理解规则方式是,先把1−101−10 都表示出来!
十进制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | I | II | III | IV | V | VI | VII | VIII | IX | X |
根据条件7,1,2,31,2,3 一定是 I,II,III
对于4,根据条件7,不能是IIII,所以根据条件2得到:IV. 对于9是同理的
I II III IV V V I VII VIII IX X
我们发现这样的规律很容易推广到10,20,...,100 与 100 , 200 , 300 , ... , 1000
十进制 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | X | XX | XXX | XL | L | LX | LXX | LXXX | XC | C |
十进制 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 |
---|---|---|---|---|---|---|---|---|---|---|
罗马数字 | C | CC | CCC | CD | D | DC | DCC | DCCC | CM | M |
有上面三张表,我们就可以表示出[1,1000] 内的任何一个数。只需要拆分十进制位即可。
例如:338=300+30+8338=300+30+8。所以是
CCCXXXVIII
实现
1.存表
2.将读入的数十进制拆分
3.查表输出
代码:
#include<bits/stdc++.h> using namespace std; string a[10000]; int main() { a[1] = "I"; a[2] = "II"; a[3] = "III"; a[4] = "IV"; a[5] = "V"; a[6] = "VI"; a[7] = "VII"; a[8] = "VIII"; a[9] = "IX"; a[10] = "X"; a[20] = "XX"; a[30] = "XXX"; a[40] = "XL"; a[50] = "L"; a[60] = "LX"; a[70] = "LXX"; a[80] = "LXXX"; a[90] = "XC"; a[100] = "C"; a[200] = "CC"; a[300] = "CCC"; a[400] = "CD"; a[500] = "D"; a[600] = "DC"; a[700] = "DCC"; a[800] = "DCCC"; a[900] = "CM"; a[1000] = "M"; int n; cin >> n; int x = n % 10; n -= x; int y = n % 100; n -= y; int z = n; cout << a[z] + a[y] + a[x] << endl; return 0; }
总结
评价
一道简单的模拟题。