我有一个有趣的问题,它与编程无关,也许与数学有关。
这是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个零数字的数字,但所有其他数字均被表示。我无法弄清楚或解释它;也许有一些数学定理可以解释它?
答案 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。