罗马数字包含以下七种字符:I,V,X,L,C,D和M。
例如,罗马数字2写做 II ,即为两个并列的 1。12 写做XII,即为X+II。27写做 XXVII,即为XX+V+ II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做 IIII,而是 IV。数字1在数字 5 的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:
。I可以放在 V(5)和 X(10)的左边,来表示 4和 9。
·X可以放在L(50)和C(100)的左边,来表示40 和 90。
。C可以放在 D(500)和M(1000)的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
C#处理逻辑如下
private class Romanner{/// <summary>/// 数字/// </summary>public int Num { get; set; }/// <summary>/// 罗马数/// </summary>public string Roman { get; set; }}private List<Romanner> _romanners = new List<Romanner>(){new Romanner(){Num=1,Roman="I"},new Romanner(){Num=4,Roman="IV"},new Romanner(){Num=5,Roman="V"},new Romanner(){Num=9,Roman="IX"},new Romanner(){Num=10,Roman="X"},new Romanner(){Num=40,Roman="XL"},new Romanner(){Num=50,Roman="L"},new Romanner(){Num=90,Roman="XC"},new Romanner(){Num=100,Roman="C"},new Romanner(){Num=400,Roman="CD"},new Romanner(){Num=500,Roman="D"},new Romanner(){Num=900,Roman="CM"},new Romanner(){Num=1000,Roman="M"}};public string GetRotmanNumbers(int num)
{// 案例// 3 III// 4 IV// 7 VII// 9 IX 10 1// 58 LVIII 50 5 1 1 1// 299 CCIC// 499 ID// 1994 MCMXCIV 1000 100 1000 10 100 1 5// 2999 MMCMXCIX// 472 CDLXXIIStringBuilder sb = new StringBuilder();var maxRommaner = _romanners.OrderByDescending(t => t.Num).First();while (num > 0){//大于区间范围内的值if (num > maxRommaner.Num){sb.Append(maxRommaner.Roman);num = num - maxRommaner.Num;}// 在定义区间范围内的值else{for (int i = 0; i < _romanners.Count; i++){// 指定区间if (num == _romanners[i].Num){sb.Append(_romanners[i].Roman);num = num - _romanners[i].Num;break;}else if (num < _romanners[i].Num){var previousRomanner = _romanners[i - 1];num = num - previousRomanner.Num;sb.Append(previousRomanner.Roman);break;}}}}return sb.ToString();
}
参考写法readonly Tuple<int, string>[] valueSymbols = {new Tuple<int, string>(1000, "M"),new Tuple<int, string>(900, "CM"),new Tuple<int, string>(500, "D"),new Tuple<int, string>(400, "CD"),new Tuple<int, string>(100, "C"),new Tuple<int, string>(90, "XC"),new Tuple<int, string>(50, "L"),new Tuple<int, string>(40, "XL"),new Tuple<int, string>(10, "X"),new Tuple<int, string>(9, "IX"),new Tuple<int, string>(5, "V"),new Tuple<int, string>(4, "IV"),new Tuple<int, string>(1, "I")};public string IntToRoman(int num){StringBuilder roman = new StringBuilder();foreach (Tuple<int, string> tuple in valueSymbols){int value = tuple.Item1;string symbol = tuple.Item2;while (num >= value){num -= value;roman.Append(symbol);}if (num == 0){break;}}return roman.ToString();}