Java 中大数的阶乘2024 年 9 月 10 日 | 阅读 7 分钟 我们已经讨论过数字的阶乘。然而,我们仍然需要单独讨论大数的阶乘。这是因为一个人不能用计算小数阶乘的方法来计算大数的阶乘。因此,在本节中,我们将讨论如何在 Java 中查找大数的阶乘。让我们通过一个例子来理解。 示例数字 10 的阶乘是 10! = 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 3628800 数字 3628800 可以轻松存储。但是,问题是,如果不是 10,而是要计算 110 的阶乘呢?110 的阶乘是 这里的问题是如何存储数字 110 的阶乘,它包含 179 位数字? 算法步骤 1:创建一个大小为 maximum 的数组“result[]”,其中 maximum 是输出中存在的最大位数。 步骤 2:将数组“result[]”中存储的值初始化为 1,并将 result[] 数组的大小 resultSize 初始化为 1。 步骤 3:对从 y = 2 到 num 的所有数字执行以下操作。 ……i) 将 y 与 result[] 相乘,并更新 result[] 和 resultSize 以保持乘法结果。 上述算法强调了基本学校数学的应用。其思想是通过分别选取两个数字的每一位来相乘,并将进位传递到下一个两位数的乘法中。让我们通过一个例子来理解。 假设我们必须将 9786 乘以 10。那么,我们将执行如下乘法。 将数字 9786 存储在数组中,如下所示 result[] = {6, 8, 7, 9} y = 10 将进位初始化为 c = 0。 对 j = 0 到 resultSize - 1 执行以下操作 ....a) 找到 result[j] * y + v 的值。设该值为 product。 ....b) 通过将 product 的最后一位存储在其中来更新 result[j]。 ....c) 通过将剩余的位数保留在进位中来更新进位。 j = 0, product = result[0] * y + c = 6 * 10 + 0 = 60。 result[0] = 0, c = 6 j = 1, product = result[1] * y + c = 8 * 10 + 6 = 86 result [1] = 6, c = 8 j = 2, product = result[2] * y + c = 7 * 10 + 8 = 78 result [2] = 8, c = 7 j = 3, product = result[3] * y + c = 9 * 10 + 7 = 97 result [3] = 7, c = 9 现在,将进位的所有位数放入 result[],并将 resultSize 增加进位中的位数。 因此, result[4] = c = 9 因此,结果数组变为 result[] = {0, 6, 8, 7, 9} 现在,我们所要做的就是按相反的顺序打印结果数组。因此,当我们将 9786 乘以 10 时,得到 97860。 注意:对于数字 9786,我们以相反的顺序将其数字存储在结果数组中。这是因为如果我们以数字中出现的相同顺序存储数字,那么在不使用额外空间的情况下更新 result[] 将变得困难。实施让我们看看上述算法的实现。 使用数组文件名:LargeNumFact.java 输出 The factorial of the number 110 is: 15882455415227429404253703127090772871724410234473563207581748318444567162948183030959960131517678520479243672638179990208521148623422266876757623911219200000000000000000000000000 使用 LinkedList除了数组之外,还可以使用链表来计算大数的阶乘。使用链表的优点是链表不会占用任何额外空间。这是因为与数组不同,我们可以根据需要分配和取消分配内存。 文件名:LargeNumFact1.java 输出 The factorial of the number 110 is: 15882455415227429404253703127090772871724410234473563207581748318444567162948183030959960131517678520479243672638179990208521148623422266876757623911219200000000000000000000000000 注意:除了在 display() 方法中使用尾部递归外,还可以使用循环遍历链表的节点,然后显示其数据。但是,在此之前,必须将其节点存储在堆栈中。这是因为数字阶乘的位数是以相反的顺序存储在链表中的。更新 display() 方法的以下代码,并且将得到相同的输出。使用 BigInteger还可以使用 BigInteger 类来计算大数的阶乘。在此方法中,我们将使用 BigInteger 类提供的 multiply() 方法。观察以下代码。 文件名:LargeNumFact2.java 输出 The factorial of the number 110 is: 15882455415227429404253703127090772871724410234473563207581748318444567162948183030959960131517678520479243672638179990208521148623422266876757623911219200000000000000000000000000 下一主题Java 中的竞争条件 |
Java 是一种广泛使用的编程语言,其受欢迎程度在很大程度上归功于其对向后兼容性的承诺。这意味着用旧版本 Java 编写的应用程序通常可以在新版本的 Java 虚拟机(JVM)上运行而无需修改。在本节中,我们将深入探讨……
阅读 4 分钟
在本节中,我们将学习什么是迷人数字,并创建 Java 程序来检查给定数字是否迷人。迷人数字程序经常在 Java 编码测试中出现。迷人数字将一个数字分别乘以二和三,...
阅读 3 分钟
Boggle 游戏是一款流行的单词搜索谜题,玩家试图在字母网格中找到隐藏的单词。目标是根据预定义的规则,通过相邻的字母路径形成单词。在编程方面,解决 Boggle 游戏涉及...
14 分钟阅读
比较两个或多个 Excel 工作簿是常见的需求,尤其是在自动化测试场景中。在本节中,我们将学习如何比较两个 Excel 工作簿,或者验证两个工作簿是否具有相同的数据集。比较 Excel 文件我们不应该从比较 Excel 工作表开始...
阅读 6 分钟
java.util.function 包首次发布于 Java 8,其中包含 LongConsumer 接口,该接口用于在 Java 中进行函数式编程。它是接受单个 long 值参数但不输出任何内容的函数的一个示例。LongConsumer 类型对象...
阅读 3 分钟
Java 程序中与安全相关的所有类都位于此包下。下面将讨论各种类:类描述 AccessControlContext 此类负责做出与系统资源访问权限相关的各种决定。该类被声明为……
阅读 6 分钟
在动态规划中,有许多算法可以找到图中的最短路径。其中一些是 Dijkstra 算法、BFS、DFS、Floyd、所有对最短路径问题和双向算法。最常用的算法是 Dijkstra 算法。该算法的局限性在于...
5 分钟阅读
矩阵沿其对角线镜像的翻转涉及对其行和列进行翻转以对称地反映元素。对于方阵,位置 (i, j) 的元素与 (j, i) 交换。该操作将矩阵转换为其转置,在各种数学和计算中很有用...
阅读9分钟
给出一个整数数组。此外,还给出一个数字 K。我们的任务是找出给定整数数组中出现次数最多的 K 个元素。示例:1 输入:Int arr[] = {5, 5, 3, 7, 9, 7, 0, 1, 2, 7}, int k =……
阅读9分钟
情侣派对问题是一个常被讨论的编程问题,其中程序员有一个由数组中的整数表示的人群。在这个人群中,每个人似乎都出现了两次,只有一个特殊的例外人士,他出现了...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India