Java 阶乘的计算 和 BigInteger 类的应用

文章介绍了BigInteger在Java中的应用,如密码学中的加密解密、数值计算和数据库编程等场景。通过示例展示了如何使用BigInteger避免整数溢出问题,计算1到100的阶乘和,强调了在处理大整数计算时使用BigInteger的必要性。
摘要由CSDN通过智能技术生成

BigInteger 类型通常用于处理大整数运算,可以存储和操作任意大小的整数值。

一、以下是一些 BigInteger 类的应用场景:

  1. 密码学:密码学中,需要使用大整数来进行加密和解密等操作。例如,RSA 算法中就需要进行大整数的乘、除、取模等数学运算,而 BigInteger 类恰好提供了这些功能。

  2. 数值计算:数值计算中,有时候需要进行极大或极小的数值计算,而这些数值超过了 Java 原生类型的表示范围。此时,可以使用 BigInteger 类型来完成这些数值计算。

  3. 数据库编程:在与数据库交互过程中,有时会涉及到超出了数据库存储整数值,此时可以使用 BigInteger 类型进行处理。

  4. 大整数计算:在一些算法、模拟等场景下,需要对极大整数进行计算,例如阶乘、斐波那契数列等等。

二、阶乘求和的计算

    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;
    }
}

                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值