求大数积

来源:互联网 发布:男士牛仔衣搭配知乎 编辑:程序博客网 时间:2024/05/16 06:18
Divide and Conquer
Implement the Karatsuba algorithm for Multiplication problem in your favourite language, and

compare the performance with quadratic grade-school method.

import java.util.Scanner;public class Karatsuba {public static int Num_ength(long m){int length=0;while(m!=0){length++;m=m/10;}return length;}public  static class split_num{int hight=0,low=0;}public static void  split(long num,long m,split_num a ){a.hight=(int) (num/Math.pow(10, m));a.low=(int) (num-a.hight*Math.pow(10, m));}  public static long Karatsuba(long num1,long num2) { split_num aNum1=new split_num(); split_num aNum2=new split_num();  int m=0;  if (num1<10 | num2<10)  return num1*num2;   if(Num_ength(num1)>Num_ength(num2))     m=Num_ength(num1)/2;     else    m=Num_ength(num2)/2; split(num1, m, aNum1); split(num2,m,aNum2); long z0=Karatsuba(aNum1.low, aNum2.low); long z1=Karatsuba((aNum1.low+aNum1.hight),(aNum2.low+aNum2.hight)); long z2=Karatsuba(aNum1.hight, aNum2.hight); return (long) (z2*Math.pow(10, 2*m)+(z1-z2-z0)*Math.pow(10, m)+z0);}public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.print("please enter two big number:"); long  num1=scanner.nextInt(); long num2=scanner.nextInt(); long time1=System.currentTimeMillis(); System.out.println(Karatsuba(num1, num2)); long time2=System.currentTimeMillis(); System.out.println(" Time is:"+(time2-time1)); long time3=System.currentTimeMillis(); long num=num1*num2; System.out.println(num);   }    }


0 0