罗马数字包含以下七种字符: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 CDLXXII
StringBuilder 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();
}