-
题目
求两个超大正整数相乘的乘积,要求不使用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();
}
}