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);//保存第一个数12345
12         int num2[] = getNum(scanner);//保存第二个数12345
13         
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位

posted on 2014-10-30 19:52  luckygxf  阅读(755)  评论(0编辑  收藏  举报

导航