迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中计算阶乘的方法

作者:迹忆客 最近更新:2023/09/28 浏览次数:

本文介绍了在 Java 中计算阶乘的方法和代码示例。

n 的阶​​乘是 1n 之间所有自然数的乘积。在本文中,我们将看到计算数字阶乘的不同方法。

我们将首先看看如何计算小于等于 20 的数字的阶乘。这种隔离是因为 Java 的长数据类型范围有限。

20 以上数字的阶乘太大而无法放入多头的范围内。


使用 Java 中的迭代方法获取阶乘

在这个例子中,我们创建了一个 long 类型的变量 store_fact,并使用 1 对其进行初始化。

然后我们遍历从 1 到计算阶乘的所有整数,并将循环变量值乘以 store_fact 值。我们将计算值存储到 store_fact 变量中并更新循环变量。

为了让上面的算法更清晰,我们可以这样写:

  • 初始化 n
  • 初始化 store_fact = 1
  • 执行 for i = 1n
  • store_fact = store_fact*n
  • 增加 i
  • 返回 store_fact

在上面的算法中,store_fact 变量存储 n 的阶​​乘如下:

  • 第一次迭代后:store_value = 1 = 1!
  • 第二次迭代后:store_value = 1 X 2 = 2!
  • 第三次迭代后:store_value = 1 X 2 X 3 = 3!
  • 第 n 次迭代后:store_value = 1 X 2 X 3 X 4 ........ Xn = n!

现在让我们看一下上述算法的代码示例。

import java.util.Scanner;
public class SimpleTesting {
    static long factCalculator(int n){
        long store_fact = 1;
        int i =1;
        while(i <= n){
            store_fact = store_fact*i;
            i++;
        }
        return store_fact;
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
    }
}

输出:

Enter a number: 
4
24

在 Java 中使用递归方法查找阶乘

上面的迭代方法可以转化为递归方法来求任意数的阶乘。在这种方法中,我们将基本情况视为:

if( n == 0 || n ==1){
            return 1;
        }

如果不满足基本条件,则返回:

n * factCalculator(n-1); 

让我们看看下面的代码示例。我们使用递归方法 factCalculator() 来查找阶乘。

import java.util.*;
public class SimpleTesting {
    static long factCalculator(int n){
        if( n == 0 || n ==1){
            return 1;
        }
        else{
            return n * factCalculator(n-1); 
        }
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
    }
}

输出:

Enter a number:
4
24

在 Java 中使用动态方法查找阶乘

我们还可以使用动态规划方法计算数字的阶乘。此方法比其他方法更快,因为它存储较小数字的阶乘并使用这些阶乘计算较大数字的阶乘。

例如:

  • 5! = 5 X 4!
  • 4! = 4 X 3!
  • 3! = 3 X 2!
  • 2! = 2 X 1!
  • 1! = 1 X 0!
  • 0! = 1

在这个方法中,我们创建了一个查找表。该表存储从 020 的数字的阶乘。

我们创建直到 20 的查找表只是因为它是阶乘 long 可以存储的最大数。我们初始化了 0!作为 1

然后我们使用值 0!计算 1!1!的值计算 2!等等。看下面的代码:

import java.util.*;
public class SimpleTesting {
    static long[] factCalculator(){
        long[] fact_table = new long[21];
        fact_table[0] = 1;
        for(int i=1; i<fact_table.length; i++){
            fact_table[i] = fact_table[i-1] * i;
        }
        return fact_table;
    }
    public static void main(String args[]) {
      long[] table = factCalculator();
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(table[number]);
    }
}

输出:

Enter a number: 
5
120

在 Java 中使用 Apache Commons 查找阶乘

如果你使用 Apache Commons Math 库,请使用带有 factorial() 方法的 CombinatoricsUtils 类。它是计算任何数字的阶乘的内置方法。

该方法返回的值为 long 类型;因此,我们无法计算大于 20 的数字的阶乘。请参见下面的示例。

import java.util.Scanner;
import org.apache.commons.math3.util.CombinatoricsUtils;
public class SimpleTesting {
    static long factCalculator(int n){
        return CombinatoricsUtils.factorial(n);
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
    }
}

输出:

Enter a number: 
5
120

使用 Java 8 流查找阶乘

我们还可以使用 Java 8 流 API 来计算数字的阶乘。我们将首先创建一个从 1n 的数字流,其中 n 是计算其阶乘的数字。

然后我们使用 reduce 方法对元素执行归约操作。我们将 1 作为单位元素,将乘法作为关联累加函数。

看下面的代码:

import java.util.*;
import java.util.stream.LongStream;
public class SimpleTesting {
    static long factCalculator(int n){
        return LongStream.rangeClosed(1,n).reduce(1, (long num1, long num2) -> num1*num2);
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
    }
}

输出:

Enter a number: 
5
120

与迭代或递归方法相比,使用 reduce() 函数有一个很大的优势。如果用于处理元素的函数是关联的,则 reduce() 操作是可并行化的。

现在,我们将计算 20 以上数字的阶乘。


在 Java 中使用 BigInteger 查找阶乘

BigInteger 类用于处理超出原始数据类型范围的非常大的数字。我们可以使用 BigInteger 来存储 20 以上数字的阶乘值。

请参见下面的示例。

import java.math.BigInteger;
import java.util.Scanner;

public class SimpleTesting {
    static BigInteger factCalculator(int n){
        BigInteger store_fact = BigInteger.ONE;
    for (int i1 = 2; i1 <= n; i1++){
        store_fact = store_fact.multiply(BigInteger.valueOf(i1));
    }
    return store_fact;
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
      scan.close();
    }
}

输出:

Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000

由于我们不能使用*运算符来乘以 BigInteger,所以我们使用 multiply() 函数。这个方法和迭代方法一样,只是我们使用 BigInteger 而不是 long。


使用 BigIntegerMath 库查找阶乘

BigIntegerMath 库有一个内置的 factorial() 方法,可用于计算数字的阶乘。它是一个静态方法并返回一个 long 类型的值。

请参见下面的示例。

import java.util.*;
import com.google.common.math.BigIntegerMath;
public class SimpleTesting {
    static long factCalculator(int n){
        return BigIntegerMath.factorial(n);
    }
    public static void main(String args[]) {
      int number;
      Scanner scan = new Scanner(System.in);
      System.out.println("Enter a number: ");
      number = scan.nextInt();
      System.out.println(factCalculator(number));
    }
}

输出:

Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

检查是否安装了 Java

发布时间:2023/09/29 浏览次数:186 分类:Java

本文按照步骤检查 Java 是否安装在不同的操作系统中。本文教我们检查机器上是否安装了 Java。一些软件和应用程序需要 Java,要检查我们的设备是否支持它,我们需要按照以下步骤操作。

检查 Java 版本

发布时间:2023/09/29 浏览次数:194 分类:Java

本文介绍了检查已安装 Java 版本的方法。Java 是一种用于创建软件应用程序的编程语言。要检查本地系统中安装的 Java 版本,你可以使用一些将结果显示到控制台的命令。

检查 Linux 中的 Java 版本

发布时间:2023/09/29 浏览次数:150 分类:Java

本文讨论了在 Linux 机器上检查 Java 版本的方法。要在 Linux 中检查 Java 版本,我们可以使用 version 命令、whereis 命令和文件路径。

在 Mac 中检查 Java 版本

发布时间:2023/09/29 浏览次数:180 分类:Java

Java 平台是一种安全的开发语言环境,使你能够在各种计算平台上快速构建和部署应用程序。它提供了一个不依赖底层操作系统的安全运行时环境,同时提供与本地方法和传统编程语言的

在 Java 中转义 HTML

发布时间:2023/09/29 浏览次数:153 分类:Java

本文解释了如何在 Java 中转义 HTML 字符和符号。为此,我们可以使用 Apache commons-text 和 StringEscapeUtils.escapeHtml4(str) 方法来转义 Java 中的 HTML 符号和字符。

Java 中的无穷大数

发布时间:2023/09/29 浏览次数:62 分类:Java

文章介绍了在 Java 中实现无穷大的方法。本文讨论了在 Java 中实现无穷大的方法。有几个数学场景可能需要实现无穷大的数学运算。

Java 中的幂运算

发布时间:2023/09/29 浏览次数:198 分类:Java

本篇文章主要讲的是在 Java 中如何进行幂运算。本文介绍了如何在 Java 中进行幂操作,并列举了一些示例代码来理解这个话题。

在 Java 中生成指定范围内的随机数

发布时间:2023/09/29 浏览次数:121 分类:Java

这篇文章介绍了如何在 Java 中生成指定范围内的随机数。本文介绍了如何在 Java 中生成指定范围内的随机数。有几种在 Java 中生成随机数的方法,例如 ThreadLocalRandom 类的 nextInt() 方法,Math 类的

Java 中的递归斐波那契数列

发布时间:2023/09/29 浏览次数:85 分类:Java

本文介绍了在 Java 中创建递归斐波那契序列的方法。由从 0 和 1 开始的最后两个数字相加形成的序列。如果要查找第 n 个元素,则可以通过(n-1)和(n-2)项相加来找到该数字,其中 n 必须大于 0。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便