BigInteger
类型通常用于处理大整数运算,可以存储和操作任意大小的整数值。
一、以下是一些 BigInteger
类的应用场景:
-
密码学:密码学中,需要使用大整数来进行加密和解密等操作。例如,RSA 算法中就需要进行大整数的乘、除、取模等数学运算,而
BigInteger
类恰好提供了这些功能。 -
数值计算:数值计算中,有时候需要进行极大或极小的数值计算,而这些数值超过了 Java 原生类型的表示范围。此时,可以使用
BigInteger
类型来完成这些数值计算。 -
数据库编程:在与数据库交互过程中,有时会涉及到超出了数据库存储整数值,此时可以使用
BigInteger
类型进行处理。 -
大整数计算:在一些算法、模拟等场景下,需要对极大整数进行计算,例如阶乘、斐波那契数列等等。
二、阶乘求和的计算
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
System.out.println(i + " 的阶乘为:" + factorial(i));
sum += factorial(i);
}
System.out.println("1~100 的阶乘和为:" + sum);
}
// 计算1到100的阶乘
//这里使用了 int 类型来存储阶乘的结果,如果 n 较大,则有可能导致整型溢出。
//在实际开发中,需要根据具体需求和情况进行处理,比如使用 BigInteger 类型
public static int factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("参数不能为负数");
}
int result = 1;
int i = 1;
do {
result *= i;
i++;
} while (i <= n);
return result;
}
但是数字一大计算得到的结果就成了负值,超过了 int 的范围(int 的最大值为2^31-1)
BigIntege类中常用的方法:
加法 ==> add()
减法 ==> subtract()
乘法 ==> multiply()
除法 ==> divide()
最大数 ==> max()
最小数 ==> min()
求余数 ==> remainder()
绝对值 ==> abs()
相反数 ==> negate()
使用 BigInteger.ZERO 初始化一个变量 sum,表示所有阶乘的和
BigInteger sum = BigInteger.ZERO;
BigInteger.ONE 是 Java 中 BigInteger 类一个静态常量,它代表数值为 1 BigInteger 对象
i 是一个 BigInteger 类型的对象,compareTo() 是一个实例方法,用于将该对象与另一个 BigInteger 对象进行比较。
BigInteger.valueOf(100L) 则是静态工厂方法 valueOf() 返回的一个 BigInteger 对象,它的值为 100。
因此,i.compareTo(BigInteger.valueOf(100L)) 的返回值为:
如果 i 等于 100,则返回 0;
如果 i 小于 100,则返回一个负数;
如果 i 大于 100,则返回一个正数。
//compareTo(BigInteger val)返回一个int型数据:1—大于; 0—等于; -1—小于;
BigInteger a = new BigInteger("13");
BigInteger b = new BigInteger("2");
int num =a.compareTo(b); // 1
System.out.println(num);
而 <= 则是小于或等于的逻辑运算符。因此,整个表达式的含义是:如果 i 小于或等于 100,则返回 true,否则返回 false。
这行代码是将 i 变量的值加 1 后再赋回 i,其作用等同于 i++ 或者 i += 1,只不过因为 i 是一个 BigInteger 类型的对象,所以需要使用 add() 方法来进行加法操作。
具体地讲,add() 方法会返回一个新的 BigInteger 对象,表示当前对象值加上指定参数后的结果。
i 代表阶乘的计数器变量,每次循环结束时,需要将其加 1,以便计算下一个数的阶乘。
因此,我们使用 i.add(BigInteger.ONE) 来创建一个新的 BigInteger 对象,其值为当前 i 的值加上 1,然后将其赋给 i 变量,即可实现对循环计数器变量 i 进行递增操作。
public class JieCheng {
public static void main(String[] args) {
for (BigInteger i = BigInteger.ONE; i.compareTo(BigInteger.valueOf(100L)) <= 0; i = i.add(BigInteger.ONE)) {
//
System.out.println(i + " 的阶乘为:" + factorial(i));
sum = sum.add(factorial(i));
}
System.out.println("1~100 的阶乘和为:" + sum);
}
public static BigInteger factorial(BigInteger n) {
if (n.compareTo(BigInteger.ZERO) < 0) {
throw new IllegalArgumentException("参数不能为负数");
}
BigInteger result = BigInteger.ONE;
BigInteger i = BigInteger.ONE;
do {
result = result.multiply(i);
i = i.add(BigInteger.ONE);
} while (i.compareTo(n) <= 0);
return result;
}
}