均使用模拟法
1、大整乘法的前提是大整数加法
public String add(String num1,String num2){
if(num1==null||num1.isEmpty())
return num2;
if(num2==null||num2.isEmpty())
return num1;
char num1Array[]=num1.toCharArray();
char num2Array[]=num2.toCharArray();
StringBuilder c=new StringBuilder();
int num1len=num1.length()-1;
int num2len=num2.length()-1;
int aSingle,bSingle;
int carry=0;
int result;
while(num1len>=0||num2len>=0||carry>0){
aSingle=(num1len>=0)?Character.getNumericValue(num1Array[num1len--]):0;
bSingle=(num2len>=0)?Character.getNumericValue(num2Array[num2len--]):0;
result=(aSingle+bSingle+carry)%10;
carry=(aSingle+bSingle+carry>=10)?1:0;
c.append(result);
}
return c.reverse().toString();
}
2、一位数乘多位数模拟,e是后边要补的0,比如12345*8,8在百位的时候要补两个0
public String multiSingle(String num1,String num2,int e){
String result="";
int carry=0,sum=0;
for(int i=num1.length()-1;i>=0;i--){
int temp=Integer.parseInt(String.valueOf(num1.charAt(i)))*
Integer.parseInt(String.valueOf(num2.charAt(0)))+carry;
carry=temp/10;
sum=temp%10;
result=String.valueOf(sum)+result;
}
if(carry>0)result=carry+result;
while(e-->0)result+=0;
return result;
}
3、模拟多位数乘多位数,先把一个数的多位与另一个的每一位相乘,然后加起来
public String multi(String num1,String num2){
String res="";
for(int i=num2.length()-1;i>=0;i--){
String temp=multiSingle(num1, String.valueOf(num2.charAt(i)), num2.length()-i-1);
res=add(temp, res);
}
return res;
}
4、测试
myBigInteger mbi=new myBigInteger();
BigInteger x=new BigInteger("55555555555555555555555555551234564557644365444444445152465664615562");
BigInteger y=new BigInteger("67892342423423422478687886868888688888888888888888888888888");
System.out.println(x.multiply(y));
System.out.println(mbi.multi("55555555555555555555555555551234564557644365444444445152465664615562",
"67892342423423422478687886868888688888888888888888888888888"));
5、结果