这是一个简单的程序,用于查找数字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)
相同的结束数字。
这里的问题在哪里,正确的实施是什么?
答案 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
。