首页 课程 师资 教程 报名

Java求阶乘的计算方法

  • 2022-10-18 11:42:28
  • 7006次 动力节点

1.概述

给定一个非负整数n,阶乘是所有小于或等于n的正整数的乘积。

在这个快速教程中,我们将探索在 Java 中为给定数字计算阶乘的不同方法。

2. 20 以内数字的阶乘

(1)使用for循环的阶乘

让我们看一个使用Java for循环的基本阶乘算法:

public long factorialUsingForLoop(int n) {
    long fact = 1;
    for (int i = 2; i <= n; i++) {
        fact = fact * i;
    }
    return fact;
}

上述解决方案适用于最多 20 的数字。但是,如果我们尝试大于 20 的值,那么它将失败,因为结果太大而无法放入 long中,从而导致溢出。

让我们再看几个,注意这些都只适用于少数人。

(2)使用 Java 8 流的阶乘

我们还可以使用Java 8 Stream API很容易地计算阶乘:

public long factorialUsingStreams(int n) {
    return LongStream.rangeClosed(1, n)
        .reduce(1, (long x, long y) -> x * y);
}

在这个程序中,我们首先使用 LongStream来遍历 1 和n之间的数字。然后我们使用reduce(),它使用标识值和累加器函数进行归约步骤。

(3)使用递归的阶乘

让我们看另一个阶乘程序的例子,这次使用递归:

public long factorialUsingRecursion(int n) {
    if (n <= 2) {
        return n;
    }
    return n * factorialUsingRecursion(n - 1);
}

(4)使用 Apache Commons Math 的阶乘

Apache Commons Math有一个带有静态阶乘方法的CombinatoricsUtils类,我们可以使用它来计算阶乘。

要包含 Apache Commons Math,我们将在 pom中 添加commons-math3依赖项:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

让我们看一个使用 CombinatoricsUtils 类的示例:

public long factorialUsingApacheCommons(int n) {
    return CombinatoricsUtils.factorial(n);
}

请注意,它的返回类型是long,就像我们自己开发的解决方案一样。

这意味着如果计算值超过Long.MAX_VALUE,则​​会抛出MathArithmeticException。

为了变得更大,我们将需要不同的返回类型。

3. 大于 20 的数的阶乘

(1)使用BigInteger的阶乘

如前所述,long数据类型只能用于n <= 20的阶乘。

对于较大的n值,我们可以使用java.math包中的BigInteger类 ,它可以容纳高达2^Integer.MAX_VALUE的值:

public BigInteger factorialHavingLargeResult(int n) {
    BigInteger result = BigInteger.ONE;
    for (int i = 2; i <= n; i++)
        result = result.multiply(BigInteger.valueOf(i));
    return result;
}

(2)使用Guava的阶乘

Google 的Guava库还提供了一种用于计算较大数字的阶乘的实用方法。

要包含该库,我们可以将其guava依赖 项添加到我们的 pom中:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

现在,我们可以使用BigIntegerMath类中的静态阶乘方法 来计算给定数字的阶乘:

public BigInteger factorialUsingGuava(int n) {
    return BigIntegerMath.factorial(n);
}

以上就是关于“Java求阶乘的计算方法”的介绍,大家如果想了解更多相关知识,可以关注一下动力节点的Java在线学习,里面的课程内容细致全面,很适合小白学习,希望对大家能够有所帮助。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交