因子非零数字不匹配

时间:2015-12-24 02:56:48

标签: python multiplication factorial digit

这是一个简单的程序,用于查找数字1到10 5 的乘积的最后几个非零数字,在此过程中删除尾随零:

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 个答案:

答案 0 :(得分:1)

您的代码在丢弃最右边的零位后正确查找最后十位数字。您认为代码不正确的信念取决于一对谬误的主张。

首先,你声称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