两个大数字相乘 用JAVA当然可以用BigInteger来算,这里写的是如何用分治法进行运算
例如123456*654321 可以把两个大数字分别才成两半即123*654 (补6个0)+ 【456*654 +123*321 】(补3个零)+456*321 每次都将大数字拆成两半运算后加起来(调用大数的加法)
import java.math.BigInteger;
public class _6_分治_03大数乘法 {
public static String BigAdd(String a,String b) //大数的加法 注意进位
{
char[]tempa = a.toCharArray();
char[]tempb = b.toCharArray();
int sumlong = tempa.length>=tempb.length?tempa.length:tempb.length; //用数组来存大数字,满10进1
int[] aa = new int[sumlong];
int[] bb = new int[sumlong];
int La = 0 , Lb=0;
if(tempa.length>=tempb.length) //a大于b b的前面补零
{
La = 0;
Lb=tempa.length-tempb.length;
for(int i=0;i<Lb;i++)
{
bb[i]=0;
}
}
else
{
Lb = 0;
La=tempb.length-tempa.length;
for(int i=0;i<La;i++)
{
aa[i]=0;
}
}
for(int i=La;i<sumlong;i++) //读入数据
{
aa[i]=tempa[i-La]-48;
}
for(int i=Lb;i<sumlong;i++)
{
bb[i]=tempb[i-Lb]-48;
}
int le = aa.length>bb.length?bb.length:aa.length; //找小的那个
int[] F = new int[le+1]; //新建最终数组 防止进位越界 直接设置+1的长度
for(int i=aa.length-1;i>=0;i--) //从后开始运算
{
int t = aa[i]+bb[i];
if(t>=10)
{
t-=10;
F[i]++;
}
F[i+1]+=t;
if(F[i+1]>=10)
{
F[i]++;
F[i+1]-=10;
}
}
String s ="";
for(int i=0;i<F.length;i++)
{
if(i==0&&F[i]==0) //第一位要是为0不写入s
continue;
s+=F[i];
}
return s;
}
public static String muti(String a,String b)
{
if(a.length()<=3&&b.length()<=3) //长度小的时候直接调用乘法
return Integer.parseInt(a)*Integer.parseInt(b)+"";
else
{
int k1 = a.length()/2;
String aa1 = a.substring(0,k1);//+aa2.length的0
String aa2 = a.substring(k1);
int La= aa2.length();
int k2 = b.length()/2;
String bb1 = b.substring(0,k2);//+bb2.length的0
String bb2 = b.substring(k2);
int Lb= bb2.length();
//共4部分分 需要补0的地方各自补0
String temp1 = muti(aa1,bb1);
for(int i=0;i<La+Lb;i++)
{
temp1+="0";
}
String temp2 = muti(aa1,bb2);
for(int i=0;i<La;i++)
{
temp2+="0";
}
String temp3 = muti(aa2,bb1);
for(int i=0;i<Lb;i++)
{
temp3+="0";
}
String temp4 = muti(aa2,bb2);
//四部分相加
String t1 = BigAdd(temp1,temp2);
String t2 = BigAdd(temp3,temp4);
String t3 = BigAdd(t1,t2);
return t3;
}
}
public static void main(String[] args) {
for(int i=0;i<10;i++)
{
String a = (int)(Math.random()*1000000000)+"";
String b = (int)(Math.random()*1000000000)+"";
System.out.println(muti(b,a).equals(new BigInteger(a).multiply(new BigInteger(b))+"")+"\n");
}
}
}