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

Java中严格使用乘除方法实现二进制转十进制的错误排查

问题修复方案

错误根因

你编写的bToD方法核心计算逻辑是正确的,已经通过逐位累加得到了正确的十进制数值n,错误出现在方法末尾的返回逻辑:
你执行了s = s + n操作,其中s是最后一次循环得到的最高位计算结果字符串"4",n是累加得到的正确结果5,二者做字符串拼接后就得到了错误的"45"。

修复后的bToD方法

只需要删除多余的拼接逻辑,直接将累加得到的n转为字符串返回即可,完全符合只能调用multiply2/divide2的要求:

//convert binary string b to an equivalent decimal string.
public static String bToD(String b)
{
    int n = 0;
    if (b.charAt(b.length()-1) == '1')
        n = 1;
    else
        n = 0;
    int pow = 1;                            //INITIALIZE POWER # FROM THE SECOND TO LAST 2^1
    for (int i=b.length()-2; i>=0; i--)    // LIST #'S FROM MOST RIGHT-HAND SIDE
    {
        char ch = b.charAt(i);
        String temp = "" + ch;
        for (int j=1; j<=pow; j++) 
            temp = multiply2(temp);
        int n1 = 0;
        for (int k=0; k<temp.length(); k++)
        {
            n1 = n1*10 + (int) (temp.charAt(k)-'0');
        }
        n = n + n1;
        pow++;
    }
    return String.valueOf(n);
}

可选优化方案

你当前的实现每次循环都要执行pow次multiply2调用,时间复杂度较高,可以优化为如下逻辑,同样只调用multiply2,时间复杂度更低:

public static String bToD(String b) {
    String res = "0";
    for (int i = 0; i < b.length(); i++) {
        // 结果先乘2
        res = multiply2(res);
        // 加上当前位的数值
        int add = b.charAt(i) - '0';
        int numRes = Integer.parseInt(res) + add;
        res = String.valueOf(numRes);
    }
    return res;
}

测试输入101后,两种修复方案都可以返回正确结果5。


内容的提问来源于stack exchange,提问作者Wolf Of Media

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:24:03