Integer to Roman
Total Accepted: 39957 Total Submissions: 116987Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
这道题目的要求简洁明了,要求我们将输入的阿拉伯数字转化为罗马数字,罗马数字的规则可以参见http://www.douban.com/note/335254352/ ,看了之后觉得好麻烦,但事实上作为计量的工具,如果人们用它之前还需要套用如此多的规则来找出正确的写法,那么这种数字应该很快就被淘汰了,因为它阻碍人们的交流。而实际上罗马数字却在阿拉伯数字流入欧洲之前被广泛使用,说明只要掌握了要领,罗马数字是可以很简单地写出来的。这种要领在我看来就是查表,其实人脑中存的就是一张表,需要书写是直接查表,而不是计算。至于这张表是什么样的见仁见智。针对这一题,我构造了下面这张表:
1000 | 100 | 10 | 1 |
---|---|---|---|
M | C | X | I |
2000 | 200 | 20 | 2 |
MM | CC | XX | II |
3000 | 300 | 30 | 3 |
MMM | CCC | XXX | III |
400 | 40 | 4 | |
CD | XL | IV | |
500 | 50 | 5 | |
D | L | V | |
600 | 60 | 6 | |
DC | LX | VI | |
700 | 70 | 7 | |
DCC | LXX | VII | |
800 | 80 | 8 | |
DCCC | LXXX | VIII | |
900 | 90 | 9 | |
CM | XC | IX |
有了这张表的好处是题目要求的1-3999,这3999个数全部可以通过查表的方式获得。例如:3481这个数,我们就查3000,400 80,1,所以对应的罗马数字为MMM, CD, LXXX,I,因此3481对应的罗马数字就是MMMCDLXXXI。所以通过上面的描述我们自然可以想到这道题的解法,就是先建表,然后按序每次取出1位,通过查表获得对应的罗马数字,然后把所有的罗马数字连起来就是最后的答案。
下面是完整程序代码:
#include <stdlib.h>
#include <iostream>
using namespace std;
char* intToRoman(int num)
{
char *table[4][10];
table[0][0] = ""; table[0][1] = "I", table[0][2] = "II", table[0][3] = "III", table[0][4] = "IV",
table[0][5] = "V", table[0][6] = "VI", table[0][7] = "VII", table[0][8] = "VIII", table[0][9] = "IX";
table[1][0] = ""; table[1][1] = "X", table[1][2] = "XX", table[1][3] = "XXX", table[1][4] = "XL",
table[1][5] = "L", table[1][6] = "LX", table[1][7] = "LXX", table[1][8] = "LXXX", table[1][9] = "XC";
table[2][0] = ""; table[2][1] = "C", table[2][2] = "CC", table[2][3] = "CCC", table[2][4] = "CD",
table[2][5] = "D", table[2][6] = "DC", table[2][7] = "DCC", table[2][8] = "DCCC", table[2][9] = "CM";
table[3][0] = ""; table[3][1] = "M", table[3][2] = "MM", table[3][3] = "MMM";
char *RomanNumeral = (char*)malloc(sizeof(char) * 20);
RomanNumeral[0] = '\0';
int i = 0;
int indices[4];
while(num != 0)
{
indices[i++] = num % 10;
num = num / 10;
}
for(int j = i-1; j >= 0; j--)
{
strcat(RomanNumeral, table[j][indices[j]]);
}
return RomanNumeral;
}
int main()
{
int num;
cout<<"Input the number:"<<endl;
cin>>num;
char *s = intToRoman(num);
cout<<s<<endl;
return 0;
}