一开始以为是分治递归的那种大整数相乘,还发现了一个牛逼算法,但是这个算法还是不能超过long,因为其中有一个longlong想加要处理,和题意不符合。
大整数相乘的牛逼方法:
https://blog.csdn.net/u010983881/article/details/77503519
Solution1:根据两数相乘的原理,用一个int【】保存先都不进位的结果。然后res数组从右往左进位。一个很tricky的点是,res数组的第0位正好可以留给最高位进位。
class Solution {
public String multiply(String num1, String num2) {
if(num1==""||num2=="")return "0";
char[] char1=num1.toCharArray();
char[] char2=num2.toCharArray();
int[] arr1 = new int[char1.length];
int[] arr2 = new int[char2.length];
for(int i = 0; i < char1.length; i++){
arr1[i] = char1[i] - '0';
}
for(int i = 0; i < char2.length; i++){
arr2[i] = char2[i] - '0';
}
int[] ans=add(arr1,arr2);
String resStr="";
//处理有数为0的情况
int isAllZero=0;
for(int i=0;i<ans.length;i++){
if(ans[i]!=0)isAllZero=1;
resStr+=String.valueOf(ans[i]);
}
if(isAllZero==1){
//最高位如果没有进位,那么res【0】默认是0,就不要输出了。
if(ans[0]==0)return resStr.substring(1);
else return resStr;
}
else{
return "0";
}
}
public int[] add(int[] nums1,int[] nums2){
int[] res=new int[nums1.length+nums2.length];
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums2.length;j++){
res[i+j+1]+=nums1[i]*nums2[j];
}
}
for(int k=res.length-1;k>0;k--){
if(res[k]>=10){
res[k-1]+=res[k]/10;
res[k]%=10;
}
}
return res;
}
}