您的位置:首页 > 其它

LeetCode 12.Integer to Roman

2017-05-04 14:23 316 查看

题目

Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.

分析

罗马数字计数方法

header 1header 2
罗马字符证书数字
I1
V5
X10
L50
C100
D500
M1000
- 规则

- 相同的数字连写,所表示的数等于这些数字相加得到的数,如III=3

- 小的数字在大的数字右边,所表示的数等于这些数据相加得到的数VIII=8,XII=12

- 小的数字,限于I、X、C在大的数字左边,所表示的数等于大数减去小数得到的数,如IV=4,IX=9;

- 正常使用时,连写的数字重复不得超过三次

- 在一个数的上面画一条横线,表示这个数扩大1000倍

- 注意事项

- 基本数字I、X、C中的任何一个 自身连用构成数目,或者放在大数右边构成数目,都不能超过三个,放在大数左边不能超过一个

- 不能把基本数字VLD中的任何一个作为小数放在大数的左边采用相减的方法构成数目,放在大数的右边采用相加的方式构成数目,只能使用一个

- V和X的左边的小数字只能用I,且只能有一个

- L和C左边的小数字只能用X,且只能有一个

- D和M左边的小数字只能用C,且只能有一个

- 算法:对数字的每位逐个判断

- 如果该位数字是9,则说明是上面3、4、5这三种情况中的一种,即把I、X、C中的一个放到了大数字的左侧;

- 如果该位数字是5~8,则说明是上面1这种情况,即I、X、C中的一个,自身连用或者放在大数的右边连用;

- 如果该位数字是4,则说明同样是上面3、4、5这三种情况中的一种,即把I、X、C中的一个放到了大数字的左侧;

- 如果该位数字是0~3,则同样说明是上面1这种情况,即I、X、C中的一个,自身连用或者放在大数的右边连用。

代码

std::string intToRoman2(int num)
{
std::string s = "";
if (num > 0 && num <= 3999){
std::cout << num << std::endl;
int n1[] = { 1000, 100, 10, 1 };
char r1[] = { 'M', 'C', 'X', 'I' };
char r2[] = { ' ', 'D', 'L', 'V' };
for (int i = 0; i < 4; ++i)
{
int b = num / n1[i];
if (b == 9)
s = s + r1[i] + r1[i - 1];
else if (b >= 5)
{
s += r2[i];
for (int j = 0; j < b - 5; ++j)
s += r1[i];
}
else if (b == 4)
s = s + r1[i] + r2[i];
else
{
for (int j = 0; j < b; ++j)
s += r1[i];
}
num = num % n1[i];
}
}

return s;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode