Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
给定一个整数,将其表示成罗马数字
class Solution {
public:
string intToRoman(int num) {
// 考虑>1000的情况
string romStr = ""; //转换后的罗马字符串
int fac = num / 1000; //1000的个数
int bas = num % 1000; //表示完千位数后的余数
for(int k=0; k<fac; k++) //有几个1000,就用几个M表示
romStr += "M";
num = bas; //剩余需要转换的数
// 考虑500<x<1000的情况
fac = num / 100; //看看有多少个100需要表示
bas = num % 100; //计算余下的二位数
if(fac == 9){ //注意900使用1000-100来表示,即CM
romStr += "CM";
}
else if(fac >= 5){ //注意当num>500时,500是一个界,需要先表示500,大于500的部分,在下面处理
romStr += "D";
bas = num % 500; //获得大于500的部分
}
else if(fac == 4){ //400需要特殊表示即500-100
romStr += "CD";
}
else{ //100,200,300 使用对应个数的C转换
for(int k=0; k<fac; k++)
romStr += "C";
}
num = bas;
// 考虑100-500的情况【这一部分是用于处理上一步>500的部分,如果上一步本身num是小于500的,则这一部分实际上是不起作用的】
fac = num / 100;
bas = num % 100;
if(fac == 4){
romStr += "CD";
}
else{
for(int k=0; k<fac; k++)
romStr += "C";
}
num = bas;
// 考虑50-100的情况 【下面的情况和500-1000的情况类似,不再展开】
fac = num / 10;
bas = num % 10;
if(fac == 9){
romStr += "XC";
}
else if(fac >= 5){
romStr += "L";
bas = num % 50;
}
else if(fac == 4){
romStr += "XL";
}
else{
for(int k=0; k<fac; k++)
romStr += "X";
}
num = bas;
// 考虑10-50的情况
fac = num / 10;
bas = num % 10;
if(fac == 4){
romStr += "XL";
}
else{
for(int k=0; k<fac; k++)
romStr += "X";
}
num = bas;
// 考虑5-10的情况
fac = num;
bas = 0;
if(fac == 9){
romStr += "IX";
}
else if(fac >= 5){
romStr += "V";
bas = num % 5;
}
else if(fac == 4){
romStr += "IV";
}
else{
for(int k=0; k<fac; k++)
romStr += "I";
}
num = bas;
// 考虑0-5的情况
for(int k=0; k<num; k++)
romStr += "I";
return romStr;
}
};LeetCode 012 Integer to Roman,布布扣,bubuko.com
原文:http://blog.csdn.net/harryhuang1990/article/details/25921989