Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.
Note:
1.The length of both num1 and num2 is < 110.
2.Both num1 and num2 contains only digits 0-9.
3.Both num1 and num2 does not contain any leading zero.
4.You must not use any built-in BigInteger library or convert the inputs to integer directly.
两个数字相乘前后都有可能超过int的表示范围,所以并不能直接将二者转化为整数求乘积。
对于长度是n1,n2的两个数字,它们乘积的最大长度是n1+n2,所以可以定义一个长度是n1+n2的数组nums3用来存储结果。按照我们计算的顺序,先固定数组num1,然后取num2的数字依次与num1相乘,然后不断刷新nums3的值,直到最后求出结果。需要注意的是nums3存储的是每一位相乘之后,再相加的值
class Solution {
public String multiply(String num1, String num2) {
int n1 = num1.length(),n2 = num2.length();
char[]nums2;
char[]nums1;
nums2 = num2.toCharArray();
nums1 = num1.toCharArray();
int[] nums3 = new int[n1+n2];
int n3 = n1+n2;
for(int i=0;i<n3;i++)
nums3[i]=-1;
if(n1==0)
return num2;
if(n2==0)
return num1;
if(num1.equals("0") ||num2.equals("0"))
return "0";
int targetnum;
int start;
int flag = 0;
int now;
for(int i=n2-1;i>=0;i--)
{
flag=0;
start = nums2[i]-'0';
for(int j = n1-1;j>=0;j--)
{
now =nums1[j]-'0';
targetnum = n3-(n2-i)-(n1-j)+1;
if(nums3[targetnum]==-1)
{
nums3[targetnum] = (now*start+flag)%10;
flag=(now*start+flag)/10;
}
else
{
int temp = nums3[targetnum];
nums3[targetnum] = (now*start+flag+nums3[targetnum])%10;
flag=(now*start+flag+temp)/10;
}
}
if(flag>0)
nums3[n3-(n2-i)-n1] = flag;
}
if(flag>0)
{
nums3[0]= flag;
StringBuffer str = new StringBuffer();
for (int i = 0; i <nums3.length ; i++) {
str = str.append(nums3[i]);
}
return str.toString();
}
else
{
StringBuffer str = new StringBuffer();
for (int i = 1; i <nums3.length ; i++) {
str = str.append(nums3[i]);
}
return str.toString();
}
}
}