divide-conquer算法:
用分治的方式求两个n位整数的乘积。
公式: XY=AC*10n+[(A-B)(D-C)+AC+BD]10n/2+B*D
例子:
X=3141 A=31 B=41 A-B=-10
Y=5327 C=53 D=27 D-C=-26
AC=(1643)'
BD=(1107)'
(A-B)(D-C)=(260)'
XY=(1643)'104+[(1643)'+(260)'+(1107)']102+(1107)' =(16732107)'
//第一轮
A=31 A1=3 B1=1 A1-B1=2
C=53 C1=5 D1=3 D1-C1=-2
A1C1=15 B1D1=3 (A1-B1)(D1-C1)=-4
AC=1500+(15+3-4)10+3=1643
//第二轮
B=41 A2=4 B2=1 A2-B2=3
D=27 C2=2 D2=7 D2-C2=5
A2C2=8 B2D2=7 (A2-B2)(D2-C2)=15
BD=800+(8+7+15)10+7=1107
//第三轮
|A-B|=10 A3=1 B3=0 A3-B3=1
|D-C|=26 C3=2 D3=6 D3-C3=4
A3C3=2 B3D3=0 (A3-B3)(D3-C3)=4
(A-B)(D-C)=200+(2+0+4)10+0=260
java代码实现:
package SimpleProblem;
import java.util.Scanner;
public class LargeIntegerMulti {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int y = scanner.nextInt();
System.out.println(multiply(x,y,(x+"").length()));
}
public static int multiply(int X,int Y ,int N ){
int sign = sign1(X)*sign1(Y);
int x=Math.abs(X);
int y=Math.abs(Y);
if(x==0||y==0) {
return 0;
}
if(N==1) {
return sign*x*y;
}else {
int A = x/(int)Math.pow(10, (int)N/2);
int B = x - A * (int)Math.pow(10, N/2);
int C = y / (int)Math.pow(10, N/2);
int D = y - C * (int)Math.pow(10, (int)N/2);
System.out.println("A="+A+" B="+B+" C="+C+" D="+D+" A-B="+(A-B)+" D-C="+(D-C));
int AC = multiply(A,C,N/2);
int BD = multiply(B,D,N/2);
int ABDC=multiply(A-B,D-C,N/2)+AC+BD;
System.out.println(AC+" "+BD+" "+ABDC);
return (sign * (AC * (int)Math.pow(10, N) + ABDC * (int)Math.pow(10, N/2) + BD));
}
}
static int sign1(int x) {
return (x>0) ? 1 : -1;
}
}
T(N)= O(nlog3)= O(n1.59)