首页 > 代码库 > java版大数相乘

java版大数相乘

在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的

http://blog.csdn.net/jianzhibeihang/article/details/4948267

用java搞了一个版本

这里说一下思路

将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中

其他注意的在注释中有说明

 1 package com.gxf.test; 2  3 import java.util.Scanner; 4  5 public class BigDataMultiply { 6  7     public static void main(String[] args) { 8         final int N = 100;//最大为100位数字相乘 9         Scanner scanner = new Scanner(System.in);10         11         int num1[] = getNum(scanner);//保存第一个数1234512         int num2[] = getNum(scanner);//保存第二个数1234513         14         int result[] = new int[2 * N];15         //第一个数12345每一位乘以第二个数12345的每一位,得到的结果放到result[]中16         //注意5乘以每一位数字保存在result[0] [1] [2] [3] [4]中17         //4乘以每一位数字时要加上[1] [2] [3] [4]中的值 18         for(int i = 0; i < num1.length; i++){19             for(int j = 0; j < num2.length; j++){20                 result[i + j] += num1[i] * num2[j];21             }22         }//得到的结果还需进位和移位处理23         //进位和移位处理24         for(int i = 0; i < 2 * N - 1; i++){25             result[i + 1] += result[i] / 10;26             result[i] = result[i] % 10;27         }28         //找出结果长度29         int length = 2 * N -1;30         while(result[length] == 0)31             length--;32         //输出结果 注意先输出高位 最高位保存在数组的高下标中  33         for(int i = length; i >= 0; i--){34             System.out.print(result[i] + " ");35         }36         scanner.close();37     }38     public static int[] getNum(Scanner scanner){39         final int N = 100;40         int num[] = new int[N];41         char array_char[];42         String str_num = "";43         //Scanner scanner = new Scanner(System.in);//用于接收输入44         45         str_num = scanner.next();46         array_char = str_num.toCharArray();//字符串12345已经转换成字符数组47         //将字符数组转换成Int数组48         int length = array_char.length;49         for(int i = 0; i < array_char.length; i++){50             num[length - i - 1] = array_char[i] - ‘0‘;//这里注意保存的位置 高位保存在数组高下标中 低位保存在数组低下标中 51             //因为后面计算的时候是从低下标中的52             //num[i] = array_char[i]53         }        54         //scanner.close();55         return num;56     }57 }

ps:为什么这里result[]大小是2*N,假设两个数是3位数,如565 * 898不可能大过1000 * 1000,而1000 * 1000的位数刚好是 2 * 3 = 6位

java版大数相乘