/**
* 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
* <p>
* 字符 数值
* I 1
* V 5
* X 10
* L 50
* C 100
* D 500
* M 1000
* 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
* <p>
* 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
* <p>
* 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
*/
//数字转罗马数字
//思路分析
//1. 要将一个数字转化为罗马字符串,首先考虑的应该是将这个数字转换为符合罗马字符规则的整数的组合
//2. 考虑如果小的罗马字符在大下罗马字符的左侧的话,执行减的操作
//3. 考虑将这些特殊的组合字符当作一个串,也就是一个字符来处理
//4. 综合以上,罗马字符对应的数字应该是有13种对应关系
//5. I-1 IV-4 V-5 IX-9 X-10 XL-40 L-50 XC-90 C-100 CD-400 D-500 CM-900 M-1000
//6. 将这些字符和数字对应的关系存储到数组中
//7. 然后拆分给定的数字,拆分应该按照罗马字符由大到小的顺序
public String intToRoman(int num) {
//先进行数字校验
if (num < 0) {
return "";
}
//定义数组保存特殊的罗马字符和对应的数字
int[] ints = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
//定义一个可变长字符串保存拆分后的罗马字符串
StringBuffer buffer = new StringBuffer();
//遍历数字数组,选择这个数字的拆分项
for (int i = 0; i < ints.length; i++) {
//循环比较
while (num >= ints[i]) {
//num 减去要拼接的数字大小
num -= ints[i];
//字符串拼接
buffer.append(romans[i]);
}
}
//返回
return buffer.toString();
}
原文:https://www.cnblogs.com/mx-info/p/14749676.html