Java实现十进制转任意进制(2≤x≤20)的代码求助
进制转换代码完善方案
原代码问题说明
你提供的代码中,不仅十进制转目标进制的部分逻辑混乱,原进制转十进制的部分也存在核心错误:
- 原进制转十进制时,错误地使用了数字的base次方,正确逻辑应为数字乘以base的对应幂次
- 十进制转目标进制的内层循环条件矛盾(
i=0且i>0),导致循环无法执行 - 使用
Math.pow会引入精度问题,且不符合整数运算逻辑 - 数字转字母的转换逻辑颠倒,无法正确生成A-J字符
修复后的完整代码
import java.util.ArrayList; import java.util.Collections; public class BaseConverter { public static String convert(int base, int target, String number) { // 第一步:将原进制数转换为十进制 ArrayList<Integer> digits = new ArrayList<>(); for (int i = 0; i < number.length(); i++) { char c = number.charAt(i); if (c >= 'A' && c <= 'J') { // 处理A-J(对应10-19) digits.add(c - 'A' + 10); } else { // 处理0-9 digits.add(c - '0'); } } long decimalValue = 0; // 用long避免溢出 for (int i = 0; i < digits.size(); i++) { int digit = digits.get(i); // 计算当前位的权重:base^(长度-1-i),用循环代替Math.pow避免精度问题 long power = 1; for (int j = 0; j < digits.size() - i - 1; j++) { power *= base; } decimalValue += digit * power; } // 第二步:将十进制数转换为目标进制 if (decimalValue == 0) { return "0"; // 特殊处理输入为0的情况 } ArrayList<Character> targetDigits = new ArrayList<>(); while (decimalValue > 0) { int remainder = (int) (decimalValue % target); // 将余数转换为对应字符 if (remainder < 10) { targetDigits.add((char) ('0' + remainder)); } else { targetDigits.add((char) ('A' + remainder - 10)); } decimalValue /= target; } // 因为取余得到的是低位到高位,需要反转得到正确顺序 Collections.reverse(targetDigits); // 将字符列表转为字符串 StringBuilder result = new StringBuilder(); for (char c : targetDigits) { result.append(c); } return result.toString(); } // 测试示例 public static void main(String[] args) { System.out.println(convert(16, 2, "A")); // 输出1010 System.out.println(convert(2, 10, "1101")); // 输出13 System.out.println(convert(10, 20, "45")); // 输出25 } }
关键逻辑说明
原进制转十进制:
- 遍历输入字符串的每个字符,将其转为对应的数字(A-J对应10-19)
- 用整数循环计算幂次代替
Math.pow,避免浮点数精度问题 - 使用
long存储十进制值,减少溢出风险
十进制转目标进制:
- 采用取余法:每次对目标进制取余得到当前位的数字,再将十进制数除以目标进制
- 余数小于10直接转为数字字符,大于等于10转为A-J字符
- 由于取余得到的是从低位到高位的顺序,最后需要反转字符列表得到正确结果
- 特殊处理输入为0的情况,避免返回空字符串
内容的提问来源于stack exchange,提问作者404notfound
相关产品推荐
相关产品推荐

