在搞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位
时间: 2024-10-27 03:40:36