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}}
- Java中的超大数相乘计算
- 两个超大数相乘
- 两个超大数相乘 和两个超大数相加
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算
- HDU1060 数学方法实现超大数计算
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- Java 递归解决 "只能两数相乘的计算器计算x^y" 问题
- java如何对两个超大数相加
- 超大数的java具体实现
- 计算N!(数组模拟超大数运算)
- [ACM_ZJUT_1382]计算N!(数组模拟超大数运算)
- Java之数组计算大数相乘
- java程序计算两个大整数相乘
- <c++>两个特别大的数之间相乘怎么计算?
- C++中string类的成员函数find_first_not_of()
- 使用 Rails Active Resource 简化 web 应用程序之间的互操作性
- 使用shell脚本统计源码文件中的注释行数.(// , /**/)
- C++中substr函数的用法
- iBatis入门
- Java中的超大数相乘计算
- 548Tree
- POJ 1696 Space Ant (向量的叉积)
- hdu2222 Keywords Search
- VC----文件名字体转换软件
- isnan isinf
- hdu 2529
- DBA手机3读书笔记整理
- CMSeasy中添加内容的方法