Python by Example 中文版:IMO与Python例2

题目:1*2*3*45……*2018*2019的值,尾数有多少个零?

步骤1:使用求质因数的方法,首先介绍算术基本定理,即:每个大于1的自然数,要么本身就是质数,要么可以写为2个或2个以上的质数的积, 而且这些质因子按大小排列之后,写法仅有一种方式。例如: 1200=2^4 * 3 * 5^2

步骤2:问题转换,1*2*3*45……*2018*2019也是一个正整数,故也可以使用算术基本定理,即写成有限个质数的乘积形式。 尾数有多少个零,就是有多少个10,而10又可以写成2*5的形式,所以此题就转换为此数转换为标准分解式后,有多少个2, 有多少个5,然后再求min(2的个数, 5的个数)

步骤3:简化问题,缩小问题的规模,如何缩小?如果要求min(2的个数, 5的个数)=?可否快速的判断出来2与5的个数哪个是更小一些呢? 明显是5的个数要比2的个数要小。但你需要把这个“明显”讲清楚。

步骤4:求解1*2*3*45……*2018*2019中5的个数。 1*2*3*45……*2018*2019中含有质因数5的数是5, 10, 15, 20, ……, 2000, 2005, 2010, 2015,形成了一个首项为5, 公差也为5的等差数列,把每个数中都先拿出一个因数5,共拿出403个5,该数列此时变为:1,2,3,……,400,401,402,403.

新形成的数列中含有质因数5的数是5, 10, 15, 20, …… 395, 400,即形成了一个首项为5,公差也为5的等差数列, 再次把每个数中都先拿出一个因数5,共拿出80个5,该数列此时变为: 1, 2, 3, ……, 79, 80,

新形成的数列中含有质因数5的数是5, 10, 15, 20, …… 75, 80,即形成了一个首项为5,公差也为5的等差数列, 再次把每个数中都先拿出一个因数5,共拿出16个5,该数列此时变为:1, 2, 3, ……, 15, 16

新形成的数列中含有质因数5的数是5, 10, 15,共可拿出3个5。故1*2*3*45……*2018*2019中 质因数5的个数为403+80+16+3=502,所以尾数共有502个零

步骤5:用python编程语言实现

sum = 0
n = 2019
print("1*2*3*4*5*......*2018*2019尾数有多少个零=?")
while (n):
    sum+=int(n/5);
    n/=5;
print(sum)

换种方法,中国剩余定理,待述。

下一个例子: 建议.