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

Java实现十进制转任意进制(2≤x≤20)的代码求助

进制转换代码完善方案

原代码问题说明

你提供的代码中,不仅十进制转目标进制的部分逻辑混乱,原进制转十进制的部分也存在核心错误:

  1. 原进制转十进制时,错误地使用了数字的base次方,正确逻辑应为数字乘以base的对应幂次
  2. 十进制转目标进制的内层循环条件矛盾(i=0且i>0),导致循环无法执行
  3. 使用Math.pow会引入精度问题,且不符合整数运算逻辑
  4. 数字转字母的转换逻辑颠倒,无法正确生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:01:04