思路
我是按照穷举条件的方法,从1000、500、100…依次除余,判断有多少个1000,500….再根据900需要1个500,4个100这个样子依次判断,代码异常丑陋,不过效率很高,用时和内存都达到100%,哈哈哈
代码
fun intToRoman(num: Int): String {var num = numval mNum = num / 1000; num -= mNum * 1000var dNum = num / 500; num -= dNum * 500var cNum = num / 100; num -= cNum * 100var lNum = num / 50; num -= lNum * 50var xNum = num / 10; num -= xNum * 10var vNum = num / 5; num -= vNum * 5var iNum = numval sb = StringBuilder()// 1000for (i in 0 until mNum) sb.append('M')// 900if (dNum == 1 && cNum == 4) {sb.append("CM")dNum -= 1cNum -= 4}// 500for (i in 0 until dNum) sb.append('D')// 400if (cNum == 4) {sb.append("CD")cNum -= 4}// 100for (i in 0 until cNum) sb.append('C')// 90if (lNum == 1 && xNum == 4) {sb.append("XC")lNum -= 1xNum -= 4}// 50for (i in 0 until lNum) sb.append('L')// 40if (xNum == 4) {sb.append("XL")xNum -= 4}// 10for(i in 0 until xNum) sb.append('X')// 9if (vNum == 1 && iNum == 4) {sb.append("IX")vNum -= 1iNum -= 4}// 5for (i in 0 until vNum) sb.append('V')// 4if (iNum == 4) {sb.append("IV")iNum -= 4}// 1for (i in 0 until iNum) sb.append('I')return sb.toString()}
优雅的代码
fun intToRoman(num: Int): String {
val values = intArrayOf(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000)
val strs = arrayOf("I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M")
val str = StringBuilder()
var numCopy = num
for (i in values.size - 1 downTo 0) {
while (numCopy >= values[i]) {
str.append(strs[i])
numCopy -= values[i]
}
}
return str.toString()
}
