因為影響生成0的是2和5的倍數,顯然這些數的分解數含2的因子多於含5的因子,因此我們可以得出乙個結論,n!的分解數中有多少個因子5,末尾就有多少個0,所以實際上就是去求n裡面有多少個5。
採用層層剝皮法去求,先以5為步長,執行一次迴圈,求出含5的個數(個數為n/5取整),再求出含25的個數(因為乙個數可以被5整除2次),有個問題還需要注意,25,125也是5的倍數,125也是25的倍數……一直到步長大於或等於n退出迴圈。
例求2016!後面0的個數呢?
同樣按照上面的方法。
5的倍數個數為:
2016/5 = 403個
25的倍數個數為:
403/5 = 80個
125的倍數的個數為:
80/5 = 16個
625的倍數的個數為: 16/5 = 3個。
所以可以得出2016!後面0的個數為:403+80+16+3 = 502個.
**如下
int
zerotrail
(int n)
//計算n!的0的個數
return count;
}
演算法分析:可以使用常規的二分法求解,也可以考慮追趕法求解。
追趕法:不斷比較得出min(a-n/d),在n/d>a時d++,相反則n++,即d和n的追趕問題。
while
(n <= l && d <= l)
//在o~這個範圍之內
if(cha >0)
//後面小了,應當增大分子
n++;else
d++;//否則減小分母
}printf
("%d %d\n"
, ansn, ansd)
;
ZUST 2019111 悲傷數字(思維 二叉樹)
題意 用4,9按大小構造數字序列a為 4,9,44,49,94,99.定義499為1z,輸入k 1 k 1e8 輸出第kz個數字。比如k 1,輸出為第499個數字,99994944。題解 因為只有4,9兩個數字,我們很容易聯想到0,1,從而想到二叉樹。我們這樣構造二叉樹,結點x的左兒子的編號為0x,...
《演算法筆記》Dijkstra演算法筆記
今日在華農終於接近完成閱讀演算法筆記,有點點成就感,做下dijkstra跟dfs演算法結合的筆記 簡單狀態 純dijkstra include include include define inf 1000000000 using namespace std const int maxn 1010 ...
回溯 皇后 演算法筆記 演算法筆記
分治演算法 線性時間選擇 o n 33 隨機線性選擇 偽 o n int partition type a,int p,int r return table n 1 w 1 main function else else lowcost i 0 for int i 1 i n i int temp ...