不导入BigInteger实现大整数相乘时负数符号输出错误问题求助
问题原因
你在处理符号的第一步就把输入字符串x和y的负号截取掉了,后续判定最终结果符号时,再去读取修改后的x、y的首字符,肯定找不到'-'标记,所以整个符号判定逻辑完全失效。
修复方案
提前用独立变量存储最终结果的符号,不要依赖已经被修改过的输入字符串做符号判定:
- 读取两个输入字符串后,先根据两个输入的符号判定最终结果的正负
- 统一去掉两个输入的负号,执行无符号大整数乘法逻辑
- 所有数值计算完成后,再根据提前存储的符号位决定是否给结果添加负号
修复后的完整代码
import java.util.Scanner; public class BigIntMultiply { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("输入第一个数字:"); String x = scan.nextLine(); System.out.println("输入第二个数字:"); String y = scan.nextLine(); // 提前存储结果符号:两数符号不同时结果为负 boolean isNegative = false; if ((x.charAt(0) == '-' && y.charAt(0) != '-') || (x.charAt(0) != '-' && y.charAt(0) == '-')) { isNegative = true; } // 统一去掉两个数的负号,只做正数乘法 if (x.charAt(0) == '-') { x = x.substring(1); } if (y.charAt(0) == '-') { y = y.substring(1); } String s1 = new StringBuffer(x).reverse().toString(); String s2 = new StringBuffer(y).reverse().toString(); int[] m = new int[s1.length() + s2.length()]; for (int i=0; i<s1.length(); i++) { for (int j=0; j<s2.length(); j++) { m[i+j] = m[i+j] + (s1.charAt(i) - '0') * (s2.charAt(j) - '0'); } } String product = ""; for (int i=0; i<m.length; i++) { int digit = m[i] % 10; int carry = m[i] / 10; if (i+1 < m.length) { m[i+1] = m[i+1] + carry; } product = digit + product; } // 去掉前导0 while (product.length() > 1 && product.charAt(0) == '0') { product = product.substring(1); } // 按提前存储的符号位添加负号 if (isNegative) { product = new StringBuffer(product).insert(0, '-').toString(); } System.out.println("相乘结果为:\n" + product); scan.close(); } }
内容的提问来源于stack exchange,提问作者Jozko Fajecka
相关产品推荐
相关产品推荐

