BigInteger类解决 <阶乘之和> 问题详解

在解决阶乘之和问题之前,我们需先了解BigInteger类,因为仅仅靠基本数据类型int、long,是不能完全解决问题的。

我们都知道Integer是int的包装类,int的最大值为2^31-1,超过这个范围之后,使用Integer数据类型就无法解决更大的数之间进行操作了,因此Java提供了BigInteger类。

接下来让我们了解一下BigInteger类吧!

一、BigInteger类大数据大都会以字符串的形式传入

BigInteger a = new BigInteger(String val);

二、BigInteger类中的常量

BigInteger zero = BigInteger.ZERO; //0
BigInteger one = BigInteger.ONE; //1
BigInteger ten = BigInteger.TEN; //10

相当于 ==>

BigInteger zero = new BigInteger("0"); 
BigInteger one = new BigInteger("1");
BigInteger ten = new BigInteger("10");

三、类型转换(int => BigInteger)

int a = 2;
BigInteger b = BigInteger.ONE;
//方法一:
b.add(BigInteger.valueOf(a)); // b+a=1+2=3
//方法二:
b.add(new BigInteger(String.valueOf(a)));
b.add(new BigInteger(Integer.toString(a)));

在上述类型转换中方法一会更快一点,效率也会更高。方法二中虽然两种都是以创建新的对象的方式来表示,但相较而言String.valueOf() 方法会更快一点

四、BigIntege类中常用的方法

  1. 加法 ==> add()
  2. 减法 ==> subtract()
  3. 乘法 ==> multiply()
  4. 除法 ==> divide()
  5. 最大数 ==> max()
  6. 最小数 ==> min()
  7. 求余数 ==> remainder()
  8. 绝对值 ==> abs()
  9. 相反数 ==> negate()

BigInteger类的基本用法也就以上这些啦。下面来解决 阶乘之和 问题:

以洛谷算法 P1009 [NOIP1998 普及组] 阶乘之和 进行讲解

这个题就需要用到高精度BigInteger类来解决,因为n的范围是 1 ≤ n ≤ 50。

上代码:

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        BigInteger S = new BigInteger("0");
        for (int i = n; i >= 1; i--) {
            BigInteger a = new BigInteger("1"); //可以换成BigInteger a = BigInteger.ONE;
            for (int j = 1; j <= i; j++) {
                a = a.multiply(BigInteger.valueOf(j));
            }
            S = S.add(a);
        }
        System.out.println(S);
        sc.close(); //释放资源
    }
}
经验分享 程序员 微信小程序 职场和发展