Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
问题分析:
罗马数字有如下的符号代表:I(1),V(5),X(10),L(50),C(100),D(500),M(1000)
罗马数字都有如下的计数规则:
1.小数字符号在大数字符号前面表示减,例如:IV=5-1=4;
2.小数字符号在大数字符号后面表示加,例如:VI=5+1=6;
3.若干个相同符号连写表示这些符号代表的数相加,例如:III=1+1+1=3;
同样也具有如下的组合规则:
1.基本数字I、X、C中的任何一个,自身连用 构成的数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数左边的只能一个。
2.不能把基本数字V、D、L中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使 用一个。
3.V和X左边的小数只能用 I。
4.L和C左边的小数只能用X。
5.D和M左边的小数只能用C。
代码编写分析:
把所有小数字在前的组合也作为基本数字,做一个对应的映射表
比如:IV=1-5=4;IX=1-10=9;XL=10-50=40;XC=10-100=90;CD=100-500=400;CM=100-1000=900。
因此可以得到对应的映射:
unsigned int val[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
string r[]={"M","CM","D”,“CD”,"C","XC”,"L","XL","X","IX",V","IV","I"}
首先定义一个string re,对于阿拉伯数字num,遍历数组val,如果num>=val[i],则结果保留r[i],做操作re+=r[i],同时更新num=num-val[i],直到num=0为止。
代码如下:
class Solution {
public:
string intToRoman(int num) {
string re="";
if(num<1||num>3999)
return re;
unsigned int val[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
unsigned int length=sizeof(val)/sizeof(int);
string r[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
for(int i=0;i<length;i++)
{
while(num>=val[i])
{
re+=r[i];
num-=val[i];
}
}
return re;
}
};