为什么阶乘数的末尾有太多零数字

时间:2019-01-02 20:11:14

标签: math numbers

我有一个有趣的问题,它与编程无关,也许与数学有关。

这是Scala上的简单代码-阶乘数

def smartFactorial(number: Int): BigInt = {
  def factorial(number: Int, accumulator: BigInt) : BigInt = {
    if (number <= 1) accumulator
    else
      factorial(number - 1, number * accumulator)
  }

  factorial(number, 1)
}
println(smartFactorial(1000))

因此,当我第一次运行此代码时,我得到的结果最后有很多零数字。首先,我认为“这是一个错误”,并尝试使用其他参数(也大于1000)运行此代码-结果相同。经过多次搜索这个问题之后,我完全无法决定:为什么阶乘的结果数最后有太多零数字,我们该如何解释呢?

此外,我写了一个小脚本来计算几个输入数字的零位末尾计数

  def countOfEndZeros(number: String): Int = {
    def countOfEndZeros(number: String, index: Int, accumulator: Int) : Int = {
      if (number.charAt(index) != '0') accumulator
      else if (index - 1 < 0) accumulator
      else countOfEndZeros(number.substring(0, index), index - 1, accumulator + 1)
    }

    countOfEndZeros(number, number.length - 1, 0)
  }

  val countExamples = 1000
  val inputs: Stream[Int] = Stream.from(1)

  inputs
    .map(i => (i, factorial(i).toString()))
    .map(t => (t._1, countOfEndZeros(t._2)))
    .take(countExamples)
    .foreach(println)

有趣的事实是,如果您运行最后一个脚本,您将看到,最后没有5个零数字的数字,但所有其他数字均被表示。我无法弄清楚或解释它;也许有一些数学定理可以解释它?

2 个答案:

答案 0 :(得分:2)

大阶乘有很多尾随零,主要有两个原因。

  • 它们由许多以零结尾的数字组成。考虑一下您乘以1000的阶乘以得出答案的所有数字,例如10、20、30等。每个中的一个加0(100、200等两个零),因为任何数字乘以10都将以0结尾。

  • 它们也由很多数字组成,这些数字是2或5的倍数。由于2 * 5 = 10,因此可以为阶乘2或5的每一个倍数加一个零。正在扩展。

答案 1 :(得分:2)

任何阶乘中都有很多2,因此您拥有的每5都会添加一个尾随0。但是,更高的5的幂的倍数(例如25、50,...)会为您提供更多的尾随0。这就是您注意到的:20!到24岁!有4个尾随0,但是25!有6个尾随0,因为25为5 * 5,这将加上两个尾随0。