大数乘法是一个很常见的问题,今年(2017年)参加拼多多内推,其中有一题就是大数乘法,今天写一下大数乘法的实现:
思路就是模拟手工计算的一个普通算法,网上说的什么分治法和FFT算法目前我还没有尝试。
把自己实现的代码贴出来
1 import java.util.Scanner; 2 3 /** 4 * 大整数相乘 5 * 6 */ 7 8 public class bigNumberMulti { 9 10 static char[] reverse(char[] ch){//字符反转,即123转为321 11 int length = ch.length; 12 char[] temp = new char[length]; 13 for(int i=0;i<length;i++){ 14 temp[length-1-i] = ch[i]; 15 } 16 17 18 return temp; 19 } 20 static void multi(char[] chr1,char[] chr2){//乘法运算 21 int n = chr1.length; 22 int m = chr2.length; 23 chr1 = reverse(chr1); 24 chr2 = reverse(chr2); 25 int [] result = new int [m+n]; 26 for(int i=0;i<n;i++){ //暂时不处理进位,将i+j位的数累加起来,然后进行统一进位处理 27 for(int j=0;j<m;j++){ 28 int temp = (chr1[i]-48)*(chr2[j]-48); 29 result[i+j] += temp; 30 } 31 } 32 33 for(int i=0;i<m+n-1;i++){ //处理进位 34 int temp = result[i]/10; 35 result[i] = result[i]%10; 36 result[i+1] += temp; 37 } 38 int location = 0; //记录最高位的位置 39 for(int i=m+n-1;i>=0;i--){ //找到最高位的位置 40 if(result[i]!=0){ 41 location = i; 42 break; 43 } 44 } 45 for(int i=location;i>=0;i--){ //打印结果 46 System.out.print(result[i]); 47 } 48 49 } 50 51 public static void main(String[] args) { 52 // TODO Auto-generated method stub 53 Scanner sc = new Scanner(System.in); 54 char [] chr1 = sc.next().toCharArray(); 55 char [] chr2 = sc.next().toCharArray(); 56 multi(chr1, chr2); 57 58 } 59 60 }