首页 > 代码库 > 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版大数相乘
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。