一道小題目 給出乙個n,求n 可被5整除多少次

2021-07-31 06:38:34 字數 1043 閱讀 7110

先上笨方法

int getdividetimes(int n, int key)

while (sum % key == 0)

return result;

}

這個解法先不說效率問題,只要n稍微大一點sum值就會溢位,所以該做法不可取,我們需要換個思路。

如果定義 sum = n! = n*(n-1)!,如果n這個數不能被5整除,那麼對於我們這題來說 n! 跟 (n-1)! 就完全沒有區別,所以:

sum = 1*2*3*4*5*6*7*8*9*10*11*...*n

可以移除無關項後優化為:

sum = 5*10*15*...*p

這裡 p 是最接近 n 的且比 n 小的5的倍數,此時右邊一共多少項呢?明顯是p/5項,其實也就是n/5項

這時右邊的n/5項元素中的每個元素都是5的倍數,那麼我們對每個元素都除一次5,一共除了n/5次,即 sum = sum / 5^(n/5),得到結果

sum = 1*2*3*4*5*...*(n/5)

結果 sum 又變成了乙個階乘即 (n/5)! ,裡面又有5的倍數,我們依然可以原樣優化:

sum = 5*10*15*...*q

這裡 q

是最接近n/5

的且比 n/5

小的5的倍數,此時右邊一共有 n/5/5 項元素

我們依然可以把右邊每項元素都除以5,然後又獲得新的階乘 (n/5/5)!,這樣迴圈下去直到這個階乘的最大項小於5,迴圈結束

此時我們統計 sum 一共做了多少次除以5的操作,就表示原始 sum 可以被 5 整除多少次

把上述的過程轉換為**,真是簡單到爆:

int getdividetimes(int n, int key)

return result;

}

結束

乙個小題目

看到一道題目,自己嘗試了一下 編寫乙個在1,2,9 順序不能變 數字之間插入 或 或什麼都不插入,使得計算結果總是100的程式,並輸出所有的可能性。例如 1 2 34 5 67 8 9 100.首先要考慮所有的可能性,每兩個數字間有3種可能,一共有3的8次方種可能。這樣就能通過遍歷實現。void v...

原型的乙個小題目

題目要求 建立乙個shape物件,該物件有乙個type屬性和gettype 方法 定義乙個原型為shape的 建構函式,用 建立的物件應有三個物件屬性 a b c,分別用於表示三角形的三條邊 在物件原型中新增乙個名為getperimeter 的新方法,用下面的 來進行測試 var t new 1,2...

一道短小精悍的JS小題目

看到題目你是不是以為我在開車,沒錯,我就不承認,你能咋的,你瞅啥,別瞅我,瞅題 題目是這樣式的 結果是啥呀,這裡我就不買關子了,結果是undefined,相信基礎好一點的大佬們一眼就能看出來,像我這種就必須兩隻眼一起看,這裡我又想問一句了,大佬們閉著乙隻眼看 不累嗎 讓我們先簡單明瞭的來解釋一下上面...