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); } } }
关键修改点说明
- 字符映射表
DIGITS:用字符串存储0-15对应的字符,通过索引快速获取数值对应的字符(比如DIGITS.charAt(13)就是'D')。 - 返回类型改为
String:这样可以自由拼接数字和字母,不再受限于整数类型。 - 输入验证:避免用户输入超出2-16范围的进制,让程序更健壮。
- 负数处理:可选扩展,支持负数的进制转换。
现在测试你提到的场景:输入200和15,程序会计算200/15=13(对应D),200%15=5,拼接后得到D5,完全符合预期!
内容的提问来源于stack exchange,提问作者Robin_Hood
相关产品推荐
相关产品推荐

