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
相关产品推荐
相关产品推荐

