xuna小记:题目解法使用c++和Python两种,重点侧重在于解题思路和如何将解法用python语言实现。
同类题目:罗马数字转化阿拉伯数字http://blog.youkuaiyun.com/xunalove/article/details/77676382
题目
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
分析
http://blog.youkuaiyun.com/xunalove/article/details/77676382
从上题可以看出我们只需罗列出没有规则的基数:
最少需要知道13个,用这13基数可以组成1~3999种的任意数。
q[1]="I" ,q[4]="IV" ,q[5]="V" ,q[9]="IX" ;
q[10]="X" ,q[40]="XL" ,q[50]="L" ,q[90]="XC" ;
q[100]="C",q[400]="CD",q[500]="D",q[900]="CM";
q[1000]="M";
计算思路:以n=3999为例。
从大向小遍历这13个基数。
1000 : 循环条件为n>=1000,得到MMM, n=999。
900 : 循环条件为n>=900,得到MMMCM, n=99。
500 : n<500 ,跳过。
………………………..
90 : 循环条件为n>=90,得到MMMCMXC, n=9。
……………………….
9 : 循环条件为n>=9,得到MMMCMXCIX, n=0,结束。
C++代码
class Solution {
public:
string intToRoman(int num)
{
map<int,string>q;
q[1]="I" ,q[4]="IV" ,q[5]="V" ,q[9]="IX" ;
q[10]="X" ,q[40]="XL" ,q[50]="L" ,q[90]="XC" ;
q[100]="C",q[400]="CD",q[500]="D",q[900]="CM";
q[1000]="M";
int m[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
string res="";
for(int i=0;i<13;i++)
{
while(num>=m[i])
{
num = num-m[i];
//cout<<n<<endl;
res+=q[m[i]];
}
if(num==0)
break;
}
return res;
}
};
Python代码
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
q={}
q[1]="I"
q[4]="IV"
q[5]="V"
q[9]="IX"
q[10]="X"
q[40]="XL"
q[50]="L"
q[90]="XC"
q[100]="C"
q[400]="CD"
q[500]="D"
q[900]="CM"
q[1000]="M"
m=[1000,900,500,400,100,90,50,40,10,9,5,4,1]
res=""
for i in range(0,13):
while num>=m[i]:
num = num-m[i]
res+=q[m[i]]
if num==0:
break
return res