小朋友学数学(23):求2000!末尾有多少个0

一、思路

一个数末尾的0是由2和5乘出来的,而1到2000里2多得是,主要看1到2000中有多少个5或5的n次方的倍数。
(1)统计5的倍数
2000/5=400,比如5、10、15、20、25等等。这些数,要么直接含了0,要么与2的倍数相乘会得到0,所以共有400个0。
(2)统计25的倍数
2000/25=80,比如25、50、75等等,这些数与4或4的倍数相乘,会得到两个0,但因为上一步中经加过一次0了,所以这里只能加80个0,而不是80 * 2 = 160个0。
(3)统计125的倍数:
2000/125=16,比如125、250、375等等,这些数与8或8的倍数相乘,会得到3个0。但是因为前两步算过两次了,这里只能再加一次。所以会增加16个0,而不是16 * 3 = 48个0。
(4)统计625的倍数
2000/625=3。这三个数分别数是625,1250和1875。这些数与16或16的倍数相乘,会得到4个0。但是前面已经计算过3次了,所以只会增加3个0,而不是3 * 4 = 12个 0。
(5)最后结果:400+80+16+3 = 499

二、编程实现

(一)用C++实现

考虑到2000!的阶乘是个很大的数,C++中的long long型变量存放不下,只能考虑用数组实现。但是数组实现会比较烦琐。若结合上面的数学思路,可以直接写出代码:

#include <iostream>
using namespace std;

int main()
{
    cout << 499 << endl;
    return 0;
}

(二)用Python实现

在Python中,有一种bignum的数据类型,可以存放很大的数。当数很大时,将自动使用bignum类型。

product = 1
count = 0
for i in range(1, 2001):
    product *= i
    
strPro = str(product)

for i in range(len(strPro) - 1, 0, -1):
    if '0' == strPro[i]:
        count += 1
    else:
        break

print(count)

少儿编程答疑、算法答疑请加微信307591841或QQ307591841

《小朋友学数学(23):求2000!末尾有多少个0》 诺依曼算法公众号.jpg

    原文作者:linux
    原文地址: https://www.jianshu.com/p/aa109b730b5e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞