Java中的超大数相乘计算

转自: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

	}

}


你可能感兴趣的:(算法)