在任何数字系统中计算阶乘数的尾随零

在特定数字系统中,如何计算数字的阶乘尾随零?


让我们看一下我们处于第十数字系统时的情况,然后看看如何将其推广到通用解决方案中。 给定数字N,并且要得到阶乘数,我们需要找到尾随零的数目。 解决方案将非常简单-总和:

Math.floor(N/5) + Math.floor(N/25) + Math.floor(N/125) + Math.floor(N/625) + ... 

我们可以将其概括为以下公式:

为什么是5? 很简单 仅当阶乘中的数字为10时才获得最终的零,因此,通过计算阶乘中的十个数,我们可以得出有限零的数量。

为什么在上面的示例中我们除以5? 因为可以通过将5乘以2来获得10。因此,完整的解决方案将具有两个公式:

但是,从逻辑上讲,我们知道第一个数量会更少,因此我们只需要计算它(更多详细信息可以在此处找到)。

解决我们的问题


为了计算特定数字系统中数字阶乘的最终零,我编译了以下算法

  1. 分解数字系统的数字B。
  2. 将数字N除以每个唯一质数K,然后将K自身相乘直到 将大于一个,同时将每个结果四舍五入为一个较小的整数。
  3. 如果在扩展数字系统的数目时,我们得到几个相同的质因子K,则以上结果应除以相同的K数。
  4. 在N除以每个唯一因子K的所有除法中,选择最小商,这将是我们的答案。

我将通过一个例子来展示它。
令数字N = 5,数字系统B =12。阶乘5! = 120,第12个系统中的120是A0。 我们看到在有限数系统中,原始数的阶乘具有一个零。 如果将12分解为素因子,则得到2、2、3。我们有两个唯一的数字:2和3。按照我们的算法,我们将用数字2满足点2。

但是在12的分解中,演绎相遇了两次,因此我们将最终结果除以2,然后四舍五入为较小的整数。 结果,我们得到1。

我们对3做同样的事情:

这样,我们得到了数N除以数系统数质数的两个商。 它们都等于1,因此我们不必选择较小的值,而只需给出答案-1。

考虑另一个例子。

令数字N = 16,数字系统B =16。阶乘16! =第16个系统中的20922789888000和20922789888000-130777758000。我们看到在最终数字系统中,原始数字的阶乘有三个零。 如果将16分解为素数,则得到2、2、2、2。这里只有一个唯一的数字,因此,第2项仅执行一次:

分解时,我们有四个减法,因此我们将除法之和除以4并舍入为较小的整数:

附言:该职位的大部分材料都从这里翻译而来阿迪亚拉梅什Aditya Ramesh)发表。

Source: https://habr.com/ru/post/zh-CN444112/


All Articles