字符串相乘
-
题目:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
-
思路:如果 num1和 num2之一是 0,则直接将 0 作为结果返回即可。
如果num1和 num2都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。
从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加,这里可以用上字符串相加的思路。需要注意的是,num2除了最低位以外,其余的每一位的运算结果都需要补0。
-
代码:
// 竖式计算 public String multiply(String num1, String num2) { if(num1.equals("0") || num2.equals("0")){ return "0"; } // 保存最终计算结果 String res = "0"; // 计算nums2每一位与num1相乘 for(int i = num2.length() - 1;i >= 0;i--){ int carry = 0; // 进位 StringBuilder temp = new StringBuilder(); // 存储nums2每一位与num1相乘的结果 // 补0 for(int j = 0;j < num2.length() - 1 - i;j++){ temp.append(0); } int n2 = num2.charAt(i) - '0'; for(int j = num1.length() - 1;j >= 0 || carry != 0;j--){ int n1 = j >= 0 ? num1.charAt(j) - '0' : 0; int product = (n1 * n2 + carry) % 10; temp.append(product); carry = (n1 * n2 + carry) / 10; } res = addString(res,temp.reverse().toString()); } return res; } public String addString(String num1,String num2){ int i = num1.length() -1,j = num2.length() -1; int carry = 0; StringBuilder res = new StringBuilder(); while(i >= 0 || j >= 0 || carry != 0){ int x = i >= 0 ? num1.charAt(i) - '0' : 0; int y = j >= 0 ? num2.charAt(j) - '0' : 0; int sum = x + y + carry; res.append(sum % 10); carry = sum / 10; i--; j--; } return res.reverse().toString(); }
-
复杂度分析:
时间复杂度:O(MN)。M,N 分别为 num1 和 num2 的长度。
空间复杂度:O(M+N)。用于存储计算结果。