小朋友學數學(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

諾依曼演算法公眾號.jpg