Java 中的阶乘末尾零2024 年 9 月 10 日 | 阅读 8 分钟 给定一个数字 n。我们的任务是找出 n 的阶乘值中存在的所有末尾零的总数。请参阅以下示例以获得更好的理解。 示例:1 输入 int n = 6 输出 1 解释:数字 6 的阶乘是 6! = 6 x 5 x 4 x 3 x 2 x 1 = 720。数字 720 中的末尾零的数量是 1。 示例:2 输入 int n = 10 输出 2 解释:数字 10 的阶乘是 10! = 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 3628800。数字 3628800 中的末尾零的数量是 2。 例如:3 输入 int n = 20 输出 4 解释:数字 20 的阶乘是 20! = 20 x 19 x 18 x 17 x 16 x 15 x 14 x 13 x 12 x 11 x 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 2432902008176640000。数字 2432902008176640000 中的末尾零的数量是 4。 朴素方法在这种方法中,我们将计算 n! 的值,然后找出 n! 中末尾零的数量。其说明如下。 文件名: TrailingZeros.java 输出 The factorial of the number 5 is: 120 The number of trailing zeros in the number 120 is: 1 The factorial of the number 10 is: 3628800 The number of trailing zeros in the number 3628800 is: 2 The factorial of the number 20 is: 2432902008176640000 The number of trailing zeros in the number 2432902008176640000 is: 4 复杂度分析:由于程序使用 for 循环计算数字 n 的阶乘,因此程序的时间复杂度为 O(n),其中 n 是输入数字。程序空间复杂度是常数,即 O(1)。
另一种方法:不计算阶乘让我们举一个例子来理解一个数字何时有末尾零。 假设我们取数字 3。我们看到 3 没有末尾零。现在将数字 3 乘以 10。我们得到 3 x 10 = 30,其中末尾零的数量是 1。请注意,10 也有一个末尾零。再次,将数字 3 乘以 100。我们得到 3 x 100 = 300,其中末尾零的数量是 2。请注意,100 也有 2 个末尾零。因此,我们看到一个数字中的末尾零数量取决于 10 的倍数。100 是 2 个十的倍数。10 x 10 = 100,因此有 2 个末尾零。1000 是三个十的倍数,10 x 10 x 10 = 1000,因此有 3 个末尾零。因此,我们所要做的就是找出给定数字 n 的阶乘中有多少个十。 现在问题来了,我们如何得到 10?10 只是 2 和 5 的乘积。因此,我们需要找出数字 *n* 的阶乘中有多少对 2 和 5,这最终归结为数字 *n* 的阶乘中存在的五的数量。这是因为数字 *n* 的阶乘中五的数量总是小于数字 *n* 的阶乘中二的数量。例如:从 1 到 8,只有一个 5 和多个二。 1 有零个二和零个五。(1 x 1 = 1) 2 有 1 个二和零个五。(2 x 1 = 2) 3 有零个二和零个五。(3 x 1 = 3) 4 有 2 个二和零个五。(2 x 2 = 4) 5 有零个二和 1 个五。(5 x 1 = 5) 6 有 1 个二和零个五。(2 x 3 = 6)。 7 有零个二和零个五。(7 x 1 = 7) 8 有 3 个二和零个五。(2 x 2 x 2 = 8) 因此,从 1 到 8,我们有 (1 + 2 + 1 + 3) 7 个二和一个五。因此,我们看到五的数量少于二的数量。因此,我们只得到一对,因为只有一个五。因此,8! = 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40320 中的末尾零数量是 1,而数字 40320 只有一个末尾零。因此,我们的答案是正确的。现在,让我们看看实现。 文件名: TrailingZeros1.java 输出 The factorial of the number 5 has: 1 trailing zeros. The factorial of the number 10 has: 2 trailing zeros. The factorial of the number 50 has: 12 trailing zeros. 复杂度分析:该程序的时间和空间复杂度与前一个程序相同。由于上述程序不计算数字的阶乘,因此即使对于大数字,它也足以找到末尾零。 下面提到了编写上述程序的更好方法。以下程序比前一个程序更优化。 最优化方法从前面的程序可以明显看出,如果我们计算输入数字中 5 的数量,我们就可以找到末尾零的数量。因此,我们所要做的就是应用循环并将数字除以 5 来减小它。其说明如下。 文件名: TrailingZeros2.java 输出 The factorial of the number 5 has: 1 trailing zeros. The factorial of the number 10 has: 2 trailing zeros. The factorial of the number 50 has: 12 trailing zeros. 复杂度分析:程序的 time complexity 为 O(log5(n)),其中 n 是输入数字。我们之所以得到这个 time complexity,是因为我们将数字 *num* 除以 5 来减小它。程序的 space complexity 与前一个程序相同。 下一个主题Java Assert 示例 |
类和对象是Java编程语言的基础,因为它是一种面向对象的语言。当我们只需要在一个程序中存储一个对象时,我们使用了Object类型的变量。然而,使用项目数组更好……
阅读 3 分钟
Java 中的 File 抽象地表示文件或目录的路径。因为它可以让开发人员在不必要时直接与底层文件系统交互的情况下处理文件路径和操作,所以这种抽象至关重要。许多 Java 应用程序经常需要……
阅读 4 分钟
集合的幂集表示所有可能子集的集合,包括空集和原集。如果一个集合包含 n 个元素,则幂集将包含 2^n 个子集。这是因为集合中的每个元素都可以...
阅读 8 分钟
在计算机科学中,特别是在密码学、数论和竞赛编程中,在大型模数下乘以大整数是一个关键问题。在处理大数时,直接乘法可能导致整数溢出或计算效率低下。为了解决这个问题,使用模运算...
5 分钟阅读
Java 中静态方法的覆盖(Shadowing)是指在同一作用域内存在两个同名静态方法。第一个方法被称为被第二个方法覆盖。当...时,第二个方法将优先于第一个方法...
阅读 3 分钟
在本节中,我们将讨论什么是全数数字及其版本,并创建 Java 程序来检查给定的数字是否为全数数字。全数数字程序经常在 Java 编码面试和学术界中被问到。全数数字:一个 10 位整数...
阅读 4 分钟
在本节中,我们将学习什么是基数,并创建 Java 程序来查找基数。基数程序经常在 Java 编码面试和学术中出现。基数 基数用于表示数量。基数是计数词...
阅读 3 分钟
有向图中的循环检测是图论中的一个核心问题,在依赖解析、调度以及某些游戏算法的某些方面中经常使用。循环实际上是一个闭合路径,它是一个从...开始的路径。
阅读 10 分钟
计算机只能理解数值。但是,并不总是能确定所有输入都是以数字形式给出的。因此,需要一个编码系统来将文本文件转换为数值。为此(发音为...
阅读 2 分钟
在 Java 8 中实现的此包提供了一种复杂而广泛的方法来处理日期、时间和时区,而传统的处理方法已知存在各种弊端。这通常表示编译器或运行时环境无法找到……
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India