計算n 中結尾零的個數 上海先鋒商泰面試歸來

2021-05-23 10:59:37 字數 956 閱讀 9029

先鋒商泰的辦事效率真不是蓋得啊,上午九點開始宣講,之後直接筆試,下午就通知通過筆試的同學去面試。面試的時候問了一些c++的基礎知識,然後談談自己最得意的專案,個人感覺沒什麼難度,只要基礎紮實的話應該沒問題。最後現場程式設計,下面和大家分享一下這道程式設計題。

題目:計算n!中結尾零的個數(c++實現) 。

當時一看到這道題目便有了思路,很快就寫出了**。我寫的**如下:

面試官看了我的**之後有些不滿意,因為這種演算法存在很大問題——如果n!很大時(大於32767時),int result就無法儲存n!的值,程式就無法正確執行。此外,由於需要進行多次累加和累乘運算,程式的效率也是非常低的。回到宿舍後我參考了網上大牛們的演算法,最後總結了幾個更好的演算法解決這個問題。

演算法思想:在1-10

兩個數相乘要產生

0,只有10×

1=2×5,

2×5。

200

!=200

×199

×198……×2

×1=2×5

×2×5

×2×199…. ×2

×1;可以分解為質數相乘的形式

,很明顯有

2的個數比5的多

,所以只要求出

200的階乘可分解出多少個5相乘

,就可得到

200的階乘結尾的連續的零的個數

.

:num=[200/5]+[200/5/5]+[200/5/5/5].

: [x]

表示對x取整.

所以可以通過這個思路很容易的得到任意階乘結尾連續的零,其示例

c語言**如下:

計算n階乘中尾部零的個數

本來覺得問題挺容易的,不打算記錄,誰知道一不小心,還真沒做出來。最終憑藉 樸實 的演算法思想解決了問題,但是其中的曲折還真是汗顏。科學的思維指導確實必不可少,野路子 的樸素的戰鬥理論不論是效率還是後續的演算法演進都經不起考驗。這裡只是記錄一下自己最近兩天對此問題的一些想法,目前只能說是解決了問題,並...

設計乙個演算法,計算出n階乘中尾部零的個數

樣例 1 輸入 11 輸出 2 樣例解釋 11 39916800,結尾的0有2個。樣例 2 輸入 5 輸出 1 樣例解釋 5 120,結尾的0有1個。思想一 碰到這個問題可能首先想到的就是用乙個for迴圈得到n的階乘,然後在算出末尾有幾個零,這種思想只能在n的階乘在資料型別範圍內,才能正確。一旦n的...

計算1到N中包含數字1的個數

mark n為正整數,計算從1到n的所有整數中包含數字1的個數。比如,n 10,從1,2.10,包含有2個數字1。相信很多人都能立刻得出以下的解法 for n n 這是最直接的解法,但遺憾的是,時間複雜程度為o n logn 因為還需要迴圈判斷當前的n的各位數,該判斷的時間複雜程度為o logn 接...