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

Java递归实现十进制转任意进制(2-16)转换器问题求助

解决十进制转任意进制(2-16)的字符显示问题

嘿,这个问题我太懂了!你的递归核心逻辑其实没问题,但当前代码返回的是int类型,没法处理大于等于10的数值对应的字母(A-F)——这就是为什么200转15进制时,程序输出135而不是预期的D5:因为13这个数字直接被拼进了结果里,而没有转换成对应的字母D。

问题根源

你的Convert方法返回int,所以当计算n%b得到13时,只能把它当作数字13来拼接,最终得到135;但我们需要的是把13映射成字符D,再和5拼接成D5,这时候int类型就满足不了需求了。

修复方案

我们只需要把返回类型改成String,再准备一个字符映射表来处理数值到字母的转换,调整递归逻辑即可:

import java.util.*;
public class Converter {
    // 预定义进制字符映射,索引对应数值,比如索引13就是'D'
    private static final String DIGITS = "0123456789ABCDEF";

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int b, n;
        System.out.println("Number: ");
        n = sc.nextInt();
        System.out.println("Base: ");
        b = sc.nextInt();

        // 新增输入验证,确保进制在2-16范围内
        if (b < 2 || b > 16) {
            System.out.println("Error: Base must be between 2 and 16!");
            return;
        }

        // 处理负数情况(可选,根据需求添加)
        if (n < 0) {
            System.out.println("Result: -" + convert(-n, b));
        } else {
            System.out.println("Result: " + convert(n, b));
        }
    }

    // 把返回类型改为String,支持字符输出
    public static String convert(int n, int b) {
        // 递归终止条件:当数值小于进制时,直接返回对应字符
        if (n < b) {
            return String.valueOf(DIGITS.charAt(n));
        } else {
            // 递归处理商,再拼接余数对应的字符
            return convert(n / b, b) + DIGITS.charAt(n % b);
        }
    }
}

关键修改点说明

  1. 字符映射表DIGITS:用字符串存储0-15对应的字符,通过索引快速获取数值对应的字符(比如DIGITS.charAt(13)就是'D')。
  2. 返回类型改为String:这样可以自由拼接数字和字母,不再受限于整数类型。
  3. 输入验证:避免用户输入超出2-16范围的进制,让程序更健壮。
  4. 负数处理:可选扩展,支持负数的进制转换。

现在测试你提到的场景:输入200和15,程序会计算200/15=13(对应D),200%15=5,拼接后得到D5,完全符合预期!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:29:07