You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin循环内无法重新赋值变量原因求解(数字转罗马数字场景)

代码问题点
  • 变量未正确赋值:Kotlin 中+属于纯运算操作,只会生成新的结果值,不会修改原变量。你代码里的romanNumeral + "I"、numberBeingChecked - 1都只是临时计算了结果,没有赋值回原变量,所以两个变量的值始终不会发生变化。需要改为赋值写法:字符串拼接用romanNumeral += "I"(等价于romanNumeral = romanNumeral + "I"),数值递减用numberBeingChecked -= 1即可。
  • 循环被提前终止:每个when分支末尾都加了break@myLoop,会导致循环仅执行一次就直接跳出,哪怕numberBeingChecked还大于0,剩余的数值根本没有处理,需要删除所有when分支中的break@myLoop语句。
  • 特殊罗马数字规则缺失:现有逻辑只能实现基础字符拼接,无法处理4(IV)、9(IX)、40(XL)、90(XC)、400(CD)、900(CM)这类特殊组合的规则,最终输出结果会不符合罗马数字规范,需要补充对应优先级更高的判断分支。
修正后完整代码
fun encode(num: Int): String {
    var numberBeingChecked: Int = num
    var romanNumeral: String = ""
    // 按从大到小排序的罗马数字映射,包含特殊规则
    val romanMap = listOf(
        1000 to "M",
        900 to "CM",
        500 to "D",
        400 to "CD",
        100 to "C",
        90 to "XC",
        50 to "L",
        40 to "XL",
        10 to "X",
        9 to "IX",
        5 to "V",
        4 to "IV",
        1 to "I"
    )

    for ((value, symbol) in romanMap) {
        while (numberBeingChecked >= value) {
            romanNumeral += symbol
            numberBeingChecked -= value
        }
        if (numberBeingChecked == 0) break
    }
    return romanNumeral
}

fun main(args: Array<String>) {
    println(encode(0)) // 输出空字符串
    println(encode(1)) // 输出 I
    println(encode(21)) // 输出 XXI
    println(encode(2008)) // 输出 MMVIII
    println(encode(1666)) // 输出 MDCLXVI
}

内容的提问来源于stack exchange,提问作者Sarbraj Dulai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:27:02