python - 阶乘非零数字不匹配

标签 python multiplication factorial digit

下面是一个简单的程序,用于查找数字 1 到 105 的乘积的最后几个非零数字,并删除尾随的零:

def f(a, b):
    s = 1
    for i in range(a, b+1):
        s *= i
        while not s % 10:
            s //= 10
        s = s % 10**10
    return s

f(1, 10**5)f(10**5+1, 2*10**5) 不会产生相同的最后 5 个数字,尽管从数学上来说它们应该是。

此外,f(1, 10**5)**10 不会产生与 f(1, 10**6) 相同的结尾数字。

问题出在哪里,正确的实现是什么?

最佳答案

您的代码正确地找到了丢弃最右边的零数字后的最后十位数字。您认为代码不正确的信念是基于两个错误的主张。

首先,您声称 1 到 n 的乘积或 n! 应该与 n+1 到 2n 的乘积具有相同的非零数字,即:

(n+1)*(n+2)*...*(2n)  =  (2n)! / n!

说的是 n! 的非零数字!和 (2n)!/n!应该相等,您暗示对于某个常数 k,我们有:

10^k * n!  =  (2n)! / n!

但这通常是错误的。考虑这个反例:

20! = 2432902008176640000
40! / 20! = 335367096786357081410764800000

你的第二个主张是n! 10 次方与 (10n)! 相同。这是错误的。一般来说,以下情况是不正确的:

(n!)^k  =  (kn)!

反例:

3!^10 = 60466176
30! = 265252859812191058636308480000000

我使用以下函数生成了这些数字:

def series(start, end):
    x = start
    for i in range(start + 1, end + 1):
        x *= i
    return x

例如,要查看 1 到 100 的乘积与 101 到 200 的乘积不具有相同的非零数字,请执行:

print(series(1, 100))
print(series(101, 200))

第一个生成的数字在删除最右边的零后的最后五位数字是16864。对于第二个,它们是 02048

关于python - 阶乘非零数字不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34446694/

相关文章:

complexity-theory - 阶乘递归算法的复杂性

python - Python 中最简单的异步/等待示例

Python:使用另一个列表中的索引汇总列表中的数据

python - 如何将列表中的所有整数相乘? - Python

r - R 中的矩阵乘法 : requires numeric/complex matrix/vector arguments

java - 快速求大数阶乘​​的方法

python - 在 pandas 中插入日期

Python 正则表达式--类型错误 : an integer is required

c - 不同整数大小的 GMP 时序差异;

java - 使用 BigInteger 类的递归查找阶乘