先鋒商泰的辦事效率真不是蓋得啊,上午九點開始宣講,之後直接筆試,下午就通知通過筆試的同學去面試。面試的時候問了一些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 接...