乐趣区

力扣(LeetCode)43

题目地址:https://leetcode-cn.com/probl… 题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3” 输出: “6” 示例 2:
输入: num1 = “123”, num2 = “456” 输出: “56088” 说明:
num1 和 num2 的长度小于 110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解答:如何使用计算机模仿大数想乘?我们用手计算的时候,会边乘边计算进位,并且把进位加在前一位。但是如果这里也这样处理,那么会无比麻烦,实际上我们可以把每一位的乘积加上,然后最后再统一处理。举例说明:124 * 32 这两个数的乘积的长度一定不会超过 m +n(m,n 分别是字符串的长度。)我们开一个 m + n 长度的数组 val[m+n]。第一轮:2*4 = 8,val[m+n-1] += 8,val[m+n-1] = 8
2*2 = 4,val[m+n-2] += 4,val[m+n-2] = 4
2*1 = 2,val[m+n-3] += 2,val[m+n-3] = 2

第二轮:3*4 = 12,val[m+n-2] += 12,val[m+n-2] = 16
3*2 = 6,val[m+n-3] += 6,val[m+n-3] = 8
3*1 = 3,val[m+n-4] += 3,val[m+n-4] = 3
至此, 该数组变为 val[0,3,8,16,8]
然后再从尾部处理进位。比如最后一位 8 是没有进位的,往前处理,到了 16,16 >= 10。把该位变成 16%10 = 6, 并且获得进位 16/10 = 1, 再继续向前处理 8 要加上进位变成 9,然后再往前处理 3 不动。最后数组变成 val[0,3,9,6,8] 到此,绝大部分工作已经完成,只需要从左扫描数组找到第一个不为 0 的数,然后把后面的加入字符串即可。
java ac 代码:
class Solution {

public String multiply(String num1, String num2) {
int[] val = new int[num1.length() + num2.length()];

for(int i = num1.length()-1,round = 0;i >= 0;i–,round++){
int k = val.length-1-round;
for(int j = num2.length()-1;j >= 0;j–)
{
int temp = (num1.charAt(i)-‘0’)*(num2.charAt(j)-‘0’);
val[k–] += temp;
}
}
int plus = 0;
for(int i = val.length-1;i >= 0;i–)
{
int sum = val[i] + plus;
val[i] = sum%10;
plus = sum/10;
}
int loc = 0;
String ans = “”;
while(loc < val.length && val[loc] == 0)loc++;
if(loc == val.length)ans = “0”;
else
for(int i = loc;i < val.length;i++)
ans += val[i];
return ans;

}
}

更为详细的讲解可以参考这篇文章 https://blog.csdn.net/afei__/…

退出移动版