题目 求两个超大正整数相乘的乘积,要求不使用BigInt 因为即使用了,也满足不了这个大整数的(会溢出)。
思路 两个大字符串相乘,可拆分为其中一个字符串的每一位与另一个字符串的每一位相乘,拼接得到一个加数,将加数存放到数组中;依次循环完成。 第二步,将数组中的各个加数的字符串取出,两两相加得出最后的结果。
import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; /** * @Author fager * @Date 2020/07/01 16:53:26 */ public class BigIntMultiply { public static void main(String[] args) { System.out.println(getMul("689","29")); } public static String getMul(String s1,String s2){ int m = s1.length(); int n = s2.length(); ArrayList<String> list = new ArrayList<>();//装好多个加数 for(int i=n-1;i>=0;i--){ StringBuilder sb = new StringBuilder(); //每下一位多乘以10 for(int j=0;j<n-1-i;j++){ sb.append(0); } int next = 0; for(int j=m-1;j>=0;j--){ int a = Integer.parseInt(s2.charAt(i)+""); int b = Integer.parseInt(s1.charAt(j)+""); int mul =a*b; int mod = mul%10; int div = mul/10; if(next != 0){ int sum = next + mod; if(sum>=10){ sb.append(sum%10); next = sum/10+div; }else{ sb.append(sum); next = div; } }else{ sb.append(mod); next = div; } } if(next != 0){ sb.append(next); } list.add(sb.toString());//这里不反转,就让它倒着,方便求和 } //进行最后的求和,两两求和 String res = "0"; if(list.size()>0) res =list.get(0); for(int i=1;i<list.size();i++){ res = getSum(res,list.get(i)); } StringBuilder r = new StringBuilder(res); return r.reverse().toString(); } private static String getSum(String s1,String s2){ int l1 = s1.length(); int l2 = s2.length(); int max = l1>l2?l1:l2; int min = l1<l2?l1:l2; StringBuilder sb = new StringBuilder(); boolean flag = false;//进位标志 for(int i=0;i<min;i++){ int x= Integer.parseInt(s1.charAt(i)+"")+Integer.parseInt(s2.charAt(i)+""); if(flag){ x = x+1; if(x>=10){ sb.append(x%10); flag=true; }else { sb.append(x); flag=false; } }else { if(x>=10){ sb.append(x%10); flag=true; }else { sb.append(x); flag=false; } } } if(flag && max==min) { sb.append(1); return sb.reverse().toString(); } for(int i=0;i<max-min;i++){ if(l1==max){ if(flag){ int x =Integer.parseInt(s1.charAt(min+i)+"")+1; if(x>=10){ sb.append(0); flag=true; }else { sb.append(x); flag=false; } }else { int x =Integer.parseInt(s1.charAt(min+i)+""); sb.append(x); } }else { if(flag){ int x =Integer.parseInt(s2.charAt(min+i)+"")+1; if(x>=10){ sb.append(0); flag=true; }else { sb.append(x); flag=false; } }else { int x =Integer.parseInt(s2.charAt(min+i)+""); sb.append(x); } } } if(flag){ sb.append(1); } return sb.toString(); } }