Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
把给定的整数转化为罗马数字。
罗马数字的符号一共只有7个:I(代表1)、V(代表5)、X(代表10)、L(代表50)、C代表100)、D(代表500)、M(代表1,000).这7个符号位置上不论怎样变化,它所代表的数字都是不变的.它们按照下列规律组合起来,就能表示任何数。
下面是别人的算法,事先建立一个储存个十百千位的表后,按罗马数字排列规律写出某一位的循环即可。
原博:http://www.cnblogs.com/etcow/archive/2012/09/13/2684057.html
public class Solution {
public string IntToRoman(int num) {
string res = "";
int[] arr = new int[4];
for(int i = 0;i<4;i++){
arr[i] = num % (int)Math.Pow(10, i + 1) / (int)Math.Pow(10, i);
}
for(int i = 3;i >= 0;i--){
if (arr[i] != 0)
{
if (i == 3)
res += D1000[arr[i] - 1];
if (i == 2)
res += D100[arr[i] - 1];
if (i == 1)
res += D10[arr[i] - 1];
if (i == 0)
res += D1[arr[i] - 1];
}
}
return res;
}
static string[] D1 = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
static string[] D10 = { "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };
static string[] D100 = { "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" };
static string[] D1000 = { "M", "MM", "MMM" };
}
或者把罗马数字中的表达形式罗列出来,然后将num从大到小分别与其对应,很简洁。
http://blog.csdn.net/beiyeqingteng/article/details/8547565
int[] val = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
StringBuilder sb = new StringBuilder();
for(int i=0;i<val.Length;i++) {
while(num >= val[i]) {
num -= val[i];
sb.Append(strs[i]);
}
}
return sb.ToString();