算法设计之大数字分治计算

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;

}

}

该算法只需要执行n / 2位整数(AC,BD和(A-B)(D-C))的3次乘法以及6次加法,减法和2次移位操作。 因此,该算法的时间复杂度为:
T(N)= O(nlog3)= O(n1.59)
持续更新~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值