`
jianshezhe
  • 浏览: 1289 次
文章分类
社区版块
存档分类
最新评论

java中不用BigInteger实现大数据的乘法操作

阅读更多
昨天看到一个题目:计算1234!,不能用BigInteger类
众所周知阶乘的数据会很大,常用的int和long型根本不够用。一般想到的只有BigInteger类,但是题目中明确说了不能用,所以只能想其它办法。
阶乘其实就是乘法的递归,这道题目可以简化为如何实现大数据的乘法,int和long型都装不下的数据,只能用String来表示,所以只要实现了两个String表示数字的乘法就可实现题目要求。
想想我们自己手算乘法的步骤,基本都是列一个竖式,分别按位相乘,进位的数相加。。只要用程序将这个过程模拟出来,就ok了。
列竖式的时候把一个数分成个十百千位。。其实就等同于整型数组。。弄清楚了这些,就可以写代码了。

package cn.baokx;

public class Training{
	public static int [] multi(String str1, String str2) {
		//将接收到的字符串转化成倒序的char数组
		StringBuffer buffer = new StringBuffer();
		buffer.append(str1);
		char[] nums1 = buffer.reverse().toString().toCharArray();
		buffer.setLength(0);
		buffer.append(str2);
		char[] nums2 = buffer.reverse().toString().toCharArray();
		
		//预先声明一个数组,用来存放各个位数相乘的结果(类似于列竖式)
		int len = nums1.length+nums2.length;
		int [] array = new int[len];
		
		//模拟竖式计算
		for(int i = 0 ; i < nums2.length ; i++){
			for(int j = 0 ; j < nums1.length ; j++){
				array[len-1-(i+j)] += (nums2[i]-48)*(nums1[j]-48);
			}
		}
		return array;
	}
	
	//对数组进行进位操作,以字符串的形式返回最终结果
	public static String arrayFormat(int [] array){
		for(int i = array.length-1 ; i > 0 ; i--){
			array[i-1] += array[i]/10;
			array[i] = array[i]%10;
		}
		StringBuffer buffer = new StringBuffer();
		if(array[0]!=0){
			buffer.append(array[0]);
		}
		for(int i = 1 ; i < array.length ; i++){
			buffer.append(array[i]);
		}
		return buffer.toString();
	}
	//阶乘
	public static String getFactorial(String num){
		if("1".equals(num)){
			return "1";
		}else{
			return arrayFormat(multi(num,getFactorial((Integer.parseInt(num)-1)+"")));
		}
	}
	public static void main(String[] args) {
		System.out.println(getFactorial("1234"));
		System.out.println(arrayFormat(multi("10","10")));
		System.out.println(arrayFormat(multi("99","99")));
	}
}
分享到:
评论

相关推荐

    java字符串数组实现大数据运算

    这个表达式涉及到指数运算和乘法,这在大数据计算中是非常常见的操作。 首先,我们来理解如何使用字符串数组来存储这样的表达式。在Java中,字符串数组可以用来存储一系列的子表达式,例如 ["(1+2)", "(1+2^2)", "...

    javaInteger大数据运算.pdf

    总结来说,Java中的`BigInteger`和`BigDecimal`是处理大数据和高精度计算的关键工具。它们允许开发者在需要精确结果时,不受标准整数和浮点数类型精度限制的影响,从而保证计算的正确性和可靠性。在进行涉及货币计算...

    大整数(java版)

    Java提供了`BigInteger`类来处理这类大数据。`BigInteger`是Java的标准库`java.math`包的一部分,它允许我们执行任意精度的算术运算,包括加法、减法、乘法和除法,这正是`大整数四则运算`的核心。 `BigInteger`类...

    java练习_大数运算_BigInteger.pdf

    在Java编程中,当我们需要处理超出普通整型数据范围的大数运算时,`BigInteger` 类提供了强大的功能。这个类属于 `java.math` 包,专门用于进行任意精度的整数运算,不受 Java 原生数据类型限制。在这个练习中,我们...

    java 数组实现大数加减乘除运算

    在Java编程中,处理大数(大数据)的加减乘除运算是一项常见的需求,尤其是在金融、科学计算等领域。数组作为一种基础数据结构,可以用来存储这些大数,通过自定义算法来实现四则运算。以下是对标题和描述中涉及的...

    基于java实现的快速幂、快速乘算法,利用二进制位运算将O(n)的算法复杂度降到O(logn)

    在Java中,我们可以使用BigInteger类的multiply()方法来处理大整数的乘法,但如果需要优化性能,可以自定义快速乘算法。例如,Karatsuba算法的Java实现可能如下: ```java public static BigInteger karatsuba...

    长整数相乘的算法实现

    例如,Python 的内置 `int` 类型就实现了高效的长整数乘法,而 Java 提供了 `BigInteger` 类来处理大整数。 在分析和实现这些算法时,我们还需要考虑以下几点: - **溢出管理**:确保在处理大整数时不会发生溢出,...

    简单百亿计算器

    "简单百亿计算器"项目就是这样一个示例,它利用了Java语言中的`java.math.BigInteger`类来实现大整数的加、减、乘、除操作。`BigInteger`类是Java标准库中的一个核心组件,为开发者提供了进行任意精度整数运算的能力...

    Long-Integer-Multiplication:这是用Java构建的乘法应用程序。 它可以在两个长整数之间执行乘法,而这是计算机无法直接完成的

    本项目"Long-Integer-Multiplication"正是基于Java的`BigInteger`类实现了一个长整数的乘法应用。 `BigInteger`类是Java的`java.math`包的一部分,它提供了一种存储和操作大整数的方法。这个类的实例可以表示任意...

    JAVA11培训课堂 2020版 部分笔记.doc

    在JAVA11的培训课程中,我们关注了两个重要的大数字操作类——BigInteger和BigDecimal,它们都位于`java.math`包中,用于处理超过普通整型和浮点型所能表示的大数字。 首先,BigInteger类是Java提供的无符号整数类...

    【题解】Bupt 13级新手专题训练②高精度和几个小数学题1

    我们可以使用 `BigInteger` 类进行类似的操作,但必须先将输入的字符串转换为 `BigInteger`,然后进行加法或乘法运算。如果结果超过 `BigInteger.MAX_VALUE`,则表示溢出。 ```java BigInteger a, b, ans = ...

    大数相乘指数幂的实现

    在实际编程中,很多编程语言提供了内置的大数库,如Python的`decimal`和`fractions`模块,Java的`BigInteger`类,C++的GMP库等,它们实现了上述算法并提供了方便的API供开发者使用。在编写代码时,理解这些算法的...

    大整数算法和二分搜索算法 Java

    这个类支持基本的算术操作,如加法、减法、乘法、除法以及模运算,并且可以进行位操作,如左移、右移和按位与、或、异或等。此外,`BigInteger`还提供了一些高级功能,如最大公约数(GCD)和最小公倍数(LCM)的计算,...

    当数值超过long位时的加减乘算法,表达式自动运算

    例如,Java提供了`BigInteger`类,C++则有GMP(GNU Multiple Precision Arithmetic Library)等第三方库。这些库支持任意大小的整数运算,包括加法、减法、乘法等,并且能够处理溢出情况,确保运算的准确性。 加法...

    java面试精华6

    - 在Java中,要跳出多重循环,可以在外部循环前定义一个标号,然后在内部循环中使用带有该标号的`break`语句。例如: ```java label: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { System.out....

    calculater.rar

    这个类可能包含了自定义的数据结构和算法,用于存储和操作大数据,并且能够执行四则运算(加法、减法、乘法和除法),避免了浮点数运算中的累积误差问题。 描述中提到的四舍五入、数据比较、ceiling和floor函数是...

    fibonacci:使用BigInteger和查找表的斐波那契方法

    在Java中,可以使用二维BigInteger数组来表示矩阵,然后实现矩阵的乘法和快速幂操作。 在压缩包文件"fibonacci-master"中,通常会包含以下内容: 1. 源代码文件:可能有一个名为"Fibonacci.java"的Java文件,包含了...

    acm源码大全各种算法

    此外,解决高精度计算问题时,还可以考虑使用特定的库,如GMP(GNU Multiple Precision Arithmetic Library)或Java中的BigInteger类,它们提供了高效的大数运算功能。这些库在处理非常大的数字时更为可靠,但可能会...

    2+22+222+2222精确计算

    4. **Java的BigInteger类和Python的decimal模块**:在高级编程语言中,往往内置了处理大数的库。比如Java的BigInteger类,它提供了大数的算术操作,包括加法。Python的decimal模块则提供了高精度的浮点数运算,适用...

    Task3:数字100的总和!

    在本任务中,我们面临的是一个数学问题,但与编程紧密相关,特别是使用Java语言来实现。题目要求计算数字100的总和,这里实际上是指100的阶乘的数字之和,而非100个数字的简单相加。100的阶乘表示为100!,意味着100...

Global site tag (gtag.js) - Google Analytics