Java 中数字阶乘的数字计数2024年9月10日 | 阅读 6 分钟 给定一个数字 n。我们的任务是找到数字 n! 中存在的数字的总位数。 示例 1 输入 int n = 9 输出 6 解释: 9! 的值为 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 362880。数字 362880 中存在的数字总数为 6。因此,结果是 6。 示例 2 int n = 12 输出 479001600 解释: 12! 的值为 12 x 11 x 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 479001600。数字 479001600 中存在的数字总数为 9。因此,结果是 9。 朴素方法在朴素方法中,我们将首先计算给定数字的阶乘,然后查找给定数字的阶乘中存在的数字数量。相同内容的说明在下面的程序中给出。 文件名: CntFactDig.java 输出 The factorial of the number 9 has 6 digits. The factorial of the number 12 has 9 digits. 复杂度分析: 该程序使用了一个 for 循环和一个 while 循环。for 循环需要 O(N) 时间,而 while 循环需要 O(log(N)) 时间。因此,程序的时间复杂度是 O(N + log(N)),其中 N 是要找到其阶乘的数字。 上述方法工作良好。然而,对于较大的输入,上述方法无法正常工作。对于 n = 50,50! = 50 x 49 x 48 x 47 x 46 x … x 45 x 44 … x 3 x 2 x 1 = 30414093201713378043612608166064768844377641568960512000000000000,将如此巨大的数字存储在 int 变量中是不可能的。有人可能会争辩说,与其使用 int,不如使用 long。但是,long 也有一个限制,当计算大数的阶乘时,也可以超出这个限制。因此,我们看到,无论使用哪种数据类型,在计算大数的阶乘时,数据类型的限制都可以轻松地被超过。因此,很明显,计算数字的阶乘(以便计算其位数)不是一种万无一失的方法。因此,我们需要找到一种不需要计算数字阶乘的方法。 方法:使用对数性质我们知道: log(p * q) = log(p) + log(q) 因此,log(q!) = log(1 x 2 x 3 x 4 x … q) = log(1) + log(2) + log(3) + log(4) + … + log(q) 现在,我们看到(数字 k 的 log10)+ 1 是数字 k 中存在的数字总数。我们将使用这个概念在下面的程序中找到 n! 中存在的数字总数。 文件名: CntFactDig1.java 输出 The factorial of the number 9 has 6 digits. The factorial of the number 12 has 9 digits. 复杂度分析: 该程序只使用一个循环。因此,程序的时间复杂度是 O(n),其中 n 是要找到其阶乘的数字。程序空间复杂度为常数,即 O(1)。 方法:Kamenetsky 公式直接的方法是使用 Kamenetsky 公式来计算数字阶乘中存在的数字数量。该公式是 P(n) = log10(((n / e) ^ n) * sqrt(2 * Pi * n)),其中 e = 2.71828182845904523536,并且 Pi = 3.141592654,n 是将输入到公式中的数字。使用此公式的一个巨大优点是,该公式对于大阶乘值非常有效。 文件名: CntFactDig2.java 输出 The factorial of the number 9 has 6 digits. The factorial of the number 12 has 9 digits. The factorial of the number 50 has 65 digits. 复杂度分析: 程序的 time complexity 是常数。程序 space complexity 也是常数。 注意:我们假设 Math.log10( ) 的时间复杂度为 O(1)。下一个主题Java 中的有效括号问题 |
它类似于 Java 中用于遍历源(集合、生成器函数或 IO 通道)元素的其他迭代器。Spliterator 是 Streams 的基础实用程序,尤其是并行 Streams。为了使用 Spliterator 处理集合,我们通过调用……来创建一个 Spliterator 对象。
阅读9分钟
在 Java 中,按值对 HashMap 进行排序很复杂,因为没有直接的方法可用。如果我们想按值对 HashMap 进行排序,我们应该创建一个 Comparator。它根据值比较两个元素。之后,获取 Map 中的元素集……
阅读 2 分钟
在 Java 中,byte 是数据类型。它是有符号的(+ 或 -)8 位值,范围从 -128 到 127。无符号字节的范围是 0 到 255。请注意,Java 不提供无符号字节。如果我们想表示一个数字为无符号...
阅读 3 分钟
什么是左截断素数?在数论中,左截断素数是一种特殊的素数,当从左侧连续移除数字时,它仍然是素数。换句话说,如果我们截掉左截断素数的左侧数字,得到的数字仍然是素数。...
阅读 3 分钟
在不断发展的编程语言和技术领域,Java 一直是构建健壮且可扩展应用程序的基石。Java 的每个版本都引入了新的功能来应对现代开发挑战。Java 21 带来了一项突破性功能——虚拟线程。虚拟...
阅读 4 分钟
? 在 Java 中,从方法返回二维数组在处理复杂数据结构或执行各种数据操作任务时可能是一项有用的操作。在本节中,我们将深入探讨如何在 Java 中返回二维数组的详细信息,并提供分步……
阅读 6 分钟
valueOf() 方法是一个静态方法,它返回保持传递参数值的相应 Integer 对象。参数可以是基本数据类型、String 等。Java 的 valueOf() 函数是映射不同数据类型(如字符串和...)的重要工具。
阅读 6 分钟
Java protected 关键字 protected 关键字用作访问修饰符。它可以与变量、方法、构造函数和内部类一起使用。此修饰符提供了一个访问级别,允许在同一包内以及由子类(即使它们在不同的包中)访问...
阅读 6 分钟
Java 中多线程、多任务处理和多处理的区别 在 Java 中开发应用程序或使用现代计算机系统时,我们经常会遇到多任务处理、多线程和多处理等术语。尽管它们都涉及同时处理多个操作,但它们的工作方式不同,并且服务于...
阅读 8 分钟
如何在 Java 中排序列表 我们可以使用以下方法对列表进行排序: 使用 stream.sorted() 方法 使用 Comparator.reverseOrder() 方法 使用 Comparator.naturalOrder() 方法 使用 Collections.reverseOrder() 方法 使用 Collections.sort() 方法 Java Stream 接口 Java Stream 接口提供了两种排序列表的方法:sorted() 方法 Stream 接口提供了一个 sorted() 方法来对列表进行排序...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India