Integer to Roman
阿拉伯数字转罗马数字的问题,其实解法很简单。我们现在已知的数有1,5,10,50,100,500和1000,而且题目中还告诉我们凡是4和9的数字都比较特殊,题目限制数字范围是1-3999,所以我们还可以知道4,9,40,90,400,900这几个比较特殊的数字。然后我们将该数字逐一减去其可以减的最大的数字(在已知的罗马数字中搜索),直到为零,将所有减去的罗马数字一一排列返回即可。
string Symbol(int val) //数字转符号
{
if(val>=1000) return "M";
else if(val>=900) return "CM";
else if(val>=500) return "D";
else if(val>=400) return "CD";
else if(val>=100) return "C";
else if(val>=90) return "XC";
else if(val>=50) return "L";
else if(val>=40) return "XL";
else if(val>=10) return "X";
else if(val>=9) return "IX";
else if(val>=5) return "V";
else if(val>=4) return "IV";
else if(val>=1) return "I";
}
int Value(string sym) //符号转数字
{
if(sym=="I") return 1;
else if(sym=="IV") return 4;
else if(sym=="V") return 5;
else if(sym=="IX") return 9;
else if(sym=="X") return 10;
else if(sym=="XL") return 40;
else if(sym=="L") return 50;
else if(sym=="XC") return 90;
else if(sym=="C") return 100;
else if(sym=="CD") return 400;
else if(sym=="D") return 500;
else if(sym=="CM") return 900;
else if(sym=="M") return 1000;
}
int Size(int num,int tmp) //求解当前数字是几位数
{
while(num/tmp>0)
{
tmp*=10;
}
tmp/=10;
return tmp;
}
string intToRoman(int num)
{
int tmp=10,m;
tmp=Size(num,tmp);
string res="";
while(true)
{
m=num/tmp*tmp;
if(m==0) return res;
res+=Symbol(m);
tmp=10;
num-=Value(Symbol(m)); //减去已取出的数字
tmp=Size(num,tmp);
}
return res;
}