Java中的超大数相乘计算

来源:互联网 发布:淘宝韩国代购真假 编辑:程序博客网 时间:2024/05/21 11:00

转自:http://blog.sina.com.cn/s/blog_4fb1c0fc0100iur4.html

   我们知道,在程序设计的时候肯定会遇到数据计算,那么数据计算就要牵扯到数据表示。在程序设计中,各种语言都为我们提供了例如int,float,double等数据类型,可以满足我们一般的计算要求,但是在一些高精度计算或者超大数据的计算中,这些数据类型明显不能满足我们的要求,在java中有一个大数类,叫做BigInteger,应该说应用范围比上述的几种数据类型的表示范围要大得多,但是仍然具有自己的界限,那么如果遇到一个一千万位的数和一个一千万位数的数相乘,如何进行计算呢,上述的数据类型显然没有办法表示和计算,所以我们必须要想起他的办法进行解决。博主的解决思路是联系计算机中的加法器,我们知道计算机中的唯一操作就是加法,所以我们把乘法操作向加法操作转换,那么数据如何存储呢?博主用的是ArrayList,因为这种数据类型,只要你的电脑内存足够大,他就可以自动增长存储空间,所以对于一千万位甚至更多位数的数的存储时可以满足要求的,吧相乘的两个数字以字符串的形式进行输入,然后拆分为单个数字,存进ArrayList,下面是博主采用简单数组进行大数计算的程序,如果需要可以将程序中的数组改为ArrayList即可。

import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class BigNumDuply {public static void main(String[] args) {Pattern p = Pattern.compile("[1-9]([0-9])*$");Scanner sc = new Scanner(System.in);String str1 = "";String str2 = "";boolean gona = true;while (gona) {System.out.println("请输入第一个数字");str1 = sc.nextLine();Matcher m1 = p.matcher(str1);if (m1.find()) {gona = false;} else {System.out.println("您输入的不是10进制数字串,请检查!请重新输入");}}gona = true;while (gona) {System.out.println("请输入第二个数字");str2 = sc.nextLine();Matcher m2 = p.matcher(str2);if (m2.find()) {gona = false;} else {System.out.println("您输入的不是10进制数字串,请检查!请重新输入");}}char[] s1 = str1.toCharArray();char[] s2 = str2.toCharArray();int length1 = 0;if (str1.length() > str2.length()) {length1 = str1.length();} else {length1 = str2.length();}int[] a = new int[length1];int[] b = new int[length1];int m = 0, n = 0;if (str1.length() > str2.length()) {for (m = 0; m < str1.length() - str2.length(); m++) {b[m] = 0;}for (m = str1.length() - str2.length(); m < str1.length(); m++) {b[m] = Integer.parseInt(String.valueOf(s2[m + str2.length()- str1.length()]));}System.out.println();for (n = 0; n < str1.length(); n++) {a[n] = Integer.parseInt(String.valueOf(s1[n]));}System.out.println();} else if (str1.length() < str2.length()) {for (m = 0; m < str2.length() - str1.length(); m++) {a[m] = 0;}for (m = str2.length() - str1.length(); m < str2.length(); m++) {a[m] = Integer.parseInt(String.valueOf(s1[m + str1.length()- str2.length()]));}System.out.println();for (n = 0; n < str2.length(); n++) {b[n] = Integer.parseInt(String.valueOf(s2[n]));}System.out.println();} else {for (int i = 0; i < a.length; i++) {a[i] = Integer.parseInt(String.valueOf(s1[i]));b[i] = Integer.parseInt(String.valueOf(s2[i]));}}int[] c = new int[length1 * 2];for (int i = 0; i < c.length; i++) {c[i] = 0;}for (int i = 1; i <= length1; i++) {for (int j = 0; j < i; j++) {c[i] += a[j] * b[i - j - 1];}}for (int i = length1 + 1; i < c.length; i++) {for (int j = i - a.length; j < a.length; j++) {c[i] += a[j] * b[i - 1 - j];}}for (int i = c.length - 1; i > 0; i--) {c[i - 1] += c[i] / 10;c[i] = c[i] % 10;}System.out.println();System.out.print("经过运算:" + str1 + "*" + str2 + "=");if (c[c.length - str1.length() - str2.length()] != 0) {for (int k = c.length - str1.length() - str2.length(); k < c.length; k++) {System.out.print(c[k]);}System.out.println();} else {for (int k = c.length - str1.length() - str2.length() + 1; k < c.length; k++) {System.out.print(c[k]);}System.out.println();}System.out.println();// TODO Auto-generated method stub}}