题目分析:
这道题目的要求是输入数字,得到对应的罗马数字。
首先得明白Roman数字构成,具体如下所示:
- 阿拉伯数字4 对应的罗马数字 IV
- 阿拉伯数字9 对应的罗马数字 IX
- 阿拉伯数字40 对应的罗马数字 XL
- 阿拉伯数字90 对应的罗马数字 XC
- 阿拉伯数字400 对应的罗马数字 CD
在了解罗马数字的基础上,对题意展开分析可知
步骤1. I 对应 1, V 对应 5, X 对应 10, L 对应 50, C 对应 100, D 对应 500, M 对应 1000; s就是有IVXLCDM这些字符组合而成。用p指向s中第一个字符,q指向s中第二个字符,用ans保存结果。
步骤2. 如果p指向字符对应的数值比q指向的大,则将p指向字符所对应的数值加到ans中;否则,从ans中减去p指向字符所对应数值。更新p和q(即p++,q++),重复执行步骤2,直到q指向最后一个字符。
步骤3. 对于最后一个字符,将其对应的数值加到ans中。
在这里我们使用STL中的map映照容器。建立罗马字符与阿拉伯数字之间的关系。
class Solution {
public:
string intToRoman(int num){
string ans=" ";//定义字符串ans为一个新的空字符串
int buf[13]={1000,900, 500,400,100,90,50,40,10,9,5,4,1};//用buff数组存储常见罗马字符对应的汉字
string roman[13]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};//用roman[]数组存储常见罗马字符
int idx=0;//设置索引初值为0
int count;//count值用于记录对应数位的数字个数
while(num>0){//判断num值的大小,若num值大于0时展开循环
count=num/buf[idx];//计算对应数位的个数
while(count--)
ans+=roman[idx];//在ans上加入count个对应的相应数字
num=num%buf[idx];//num的值进行降位
idx++;标签值递加
}
return ans;//返回最后的结果
}
};