设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每
2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n^2)步运算才能求出乘积XY。下面我们用分治法来设计一个更有效的大整数乘积算法。
我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂)。由此,X=A2^n/2+B ,Y=C2^n/2+D。这样,X和Y的乘积为:
XY=(A2^n/2+B)(C2^n/2+D)=AC2^n+(AD+CB)2^n/2+BD 1
如果按式1计算XY,则我们必须进行4次n/2位整数的乘法(AC,AD,BC和BD), 以及3次不超过n位的整数加法(分别对应于式1中的加号),此外还要做2次移位(分别对应于上式中乘2n和乘2n/2)。所有这些加法和移位共用O(n)步运算。设T(n)是2个n位整数相乘所需的运算总数,则由式1,T(n)=O(n^2)。
XY=AC2^n+[(A-B)(D-C)+AC+BD]2^n/2+BD 2
虽然,式2看起来比式1复杂些,但它仅需做3次n/2位整数的乘法(AC,BD和(A-B)(D-C)),6次加、减法和2次移位。由此可得: T(n)=O(nlog3)=O(n1.59)。
实现代码:
package algrithm;
import java.util.Scanner;
public class bigNumMultiply {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
String a=sc.nextLine();
String b=sc.nextLine();
int result=mutiply(a,b);
System.out.println(result);
}
public static int mutiply(String a,String b)
{
int alen,blen;
int alength,blength;
int temp=0;
if(a.length()==1||b.length()==1)
{
temp=mutip(a,b);
}
else
{
alength=a.length()-1;
alen=alength-alength/2;
String a1=a.substring(0, alength/2+1);
String a2=a.substring((alength/2)+1, a.length());
blength=b.length()-1;
blen=blength-blength/2;
String b1=b.substring(0, blength/2+1);
String b2=b.substring((blength/2)+1, b.length());
temp=(int) (mutiply(a1,b1)*Math.pow(10, alen+blen)+mutiply(a1,b2)*Math.pow(10, alen)+
mutiply(a2,b1)*Math.pow(10, blen)+mutiply(a2,b2));
}
return temp;
}
public static int mutip(String a,String b)
{
int n1=stringToint(a);
int n2=stringToint(b);
return n1*n2;
}
public static int stringToint(String str)
{
int slength=str.length(),result=0;
int a[]=new int[slength];
for(int i=0;i<slength;i++)
a[i]=(int)str.charAt(i)-48;
for(int j=0;j<slength;j++)
result=result*10+a[j];
return result;
}
}