昨天看到一个题目:计算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中,字符串数组可以用来存储一系列的子表达式,例如 ["(1+2)", "(1+2^2)", "...
总结来说,Java中的`BigInteger`和`BigDecimal`是处理大数据和高精度计算的关键工具。它们允许开发者在需要精确结果时,不受标准整数和浮点数类型精度限制的影响,从而保证计算的正确性和可靠性。在进行涉及货币计算...
Java提供了`BigInteger`类来处理这类大数据。`BigInteger`是Java的标准库`java.math`包的一部分,它允许我们执行任意精度的算术运算,包括加法、减法、乘法和除法,这正是`大整数四则运算`的核心。 `BigInteger`类...
在Java编程中,当我们需要处理超出普通整型数据范围的大数运算时,`BigInteger` 类提供了强大的功能。这个类属于 `java.math` 包,专门用于进行任意精度的整数运算,不受 Java 原生数据类型限制。在这个练习中,我们...
在Java编程中,处理大数(大数据)的加减乘除运算是一项常见的需求,尤其是在金融、科学计算等领域。数组作为一种基础数据结构,可以用来存储这些大数,通过自定义算法来实现四则运算。以下是对标题和描述中涉及的...
在Java中,我们可以使用BigInteger类的multiply()方法来处理大整数的乘法,但如果需要优化性能,可以自定义快速乘算法。例如,Karatsuba算法的Java实现可能如下: ```java public static BigInteger karatsuba...
例如,Python 的内置 `int` 类型就实现了高效的长整数乘法,而 Java 提供了 `BigInteger` 类来处理大整数。 在分析和实现这些算法时,我们还需要考虑以下几点: - **溢出管理**:确保在处理大整数时不会发生溢出,...
"简单百亿计算器"项目就是这样一个示例,它利用了Java语言中的`java.math.BigInteger`类来实现大整数的加、减、乘、除操作。`BigInteger`类是Java标准库中的一个核心组件,为开发者提供了进行任意精度整数运算的能力...
本项目"Long-Integer-Multiplication"正是基于Java的`BigInteger`类实现了一个长整数的乘法应用。 `BigInteger`类是Java的`java.math`包的一部分,它提供了一种存储和操作大整数的方法。这个类的实例可以表示任意...
在JAVA11的培训课程中,我们关注了两个重要的大数字操作类——BigInteger和BigDecimal,它们都位于`java.math`包中,用于处理超过普通整型和浮点型所能表示的大数字。 首先,BigInteger类是Java提供的无符号整数类...
我们可以使用 `BigInteger` 类进行类似的操作,但必须先将输入的字符串转换为 `BigInteger`,然后进行加法或乘法运算。如果结果超过 `BigInteger.MAX_VALUE`,则表示溢出。 ```java BigInteger a, b, ans = ...
在实际编程中,很多编程语言提供了内置的大数库,如Python的`decimal`和`fractions`模块,Java的`BigInteger`类,C++的GMP库等,它们实现了上述算法并提供了方便的API供开发者使用。在编写代码时,理解这些算法的...
这个类支持基本的算术操作,如加法、减法、乘法、除法以及模运算,并且可以进行位操作,如左移、右移和按位与、或、异或等。此外,`BigInteger`还提供了一些高级功能,如最大公约数(GCD)和最小公倍数(LCM)的计算,...
例如,Java提供了`BigInteger`类,C++则有GMP(GNU Multiple Precision Arithmetic Library)等第三方库。这些库支持任意大小的整数运算,包括加法、减法、乘法等,并且能够处理溢出情况,确保运算的准确性。 加法...
- 在Java中,要跳出多重循环,可以在外部循环前定义一个标号,然后在内部循环中使用带有该标号的`break`语句。例如: ```java label: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { System.out....
这个类可能包含了自定义的数据结构和算法,用于存储和操作大数据,并且能够执行四则运算(加法、减法、乘法和除法),避免了浮点数运算中的累积误差问题。 描述中提到的四舍五入、数据比较、ceiling和floor函数是...
在Java中,可以使用二维BigInteger数组来表示矩阵,然后实现矩阵的乘法和快速幂操作。 在压缩包文件"fibonacci-master"中,通常会包含以下内容: 1. 源代码文件:可能有一个名为"Fibonacci.java"的Java文件,包含了...
此外,解决高精度计算问题时,还可以考虑使用特定的库,如GMP(GNU Multiple Precision Arithmetic Library)或Java中的BigInteger类,它们提供了高效的大数运算功能。这些库在处理非常大的数字时更为可靠,但可能会...
4. **Java的BigInteger类和Python的decimal模块**:在高级编程语言中,往往内置了处理大数的库。比如Java的BigInteger类,它提供了大数的算术操作,包括加法。Python的decimal模块则提供了高精度的浮点数运算,适用...
在本任务中,我们面临的是一个数学问题,但与编程紧密相关,特别是使用Java语言来实现。题目要求计算数字100的总和,这里实际上是指100的阶乘的数字之和,而非100个数字的简单相加。100的阶乘表示为100!,意味着100...