ZCMU1375 階乘的零(二分法)

2021-08-21 20:24:15 字數 1259 閱讀 6952

定義f(n)為n!的末尾零的個數,例如f(4)=0,f(5)=1。你的任務是對於乙個給定的的值x找出最小的n滿足f(n)=x。

多組測試資料,每組測試資料報含乙個正整數x(1<=x<=10^8)。

對於每組測試資料輸出對應的n,若沒有n滿足則輸出「no solution」。

water problem!

先說一下這一道題的思路吧:

我們通常看到這一道題的思路就是乙個n的階乘問你後面有幾個零,但這道題目的意思卻剛好反了過來,給你階乘後面有多少個零,問你滿足這個條件的n的最小值是多少。

我們先看一下2023年網易的筆試題(基本上完全一樣):

求2016的階乘後面有多少個零:

下面是解法:

5的倍數個數為:  2016/5 = 403個

25的倍數個數為:  403/5 = 80個 

125的倍數的個數為:80/5 = 16個

625的倍數的個數為: 16/5 = 3個。

所以可以得出2016!後面0的個數為:403+80+16+3 = 502個.

類似的,對於這一道題目的話,我們可以先構造出乙個函式關於求n的階乘後面有多少個零的,然後再在乙個比較大的數的 範圍內直接進行查詢就好了,用二分查詢的速度也很快,如果用普通遍歷演算法的話很容易就超時了,這個的話只要比較一下零的個數對不對就可以了,如果少了的,就擴大範圍,多了就減少範圍,非常nice的就把題目a了,不過二分法的細節也要注意好,不然非常容易錯。

/*********************************

解決關於輸入n的階乘末尾有幾個零,輸出滿足條件的n的最小值問題,所以要比常規思路反方向考慮。

用普通迴圈的方法很有可能就會超時,所以直接用二分來做就可以了。

1.構造出facs函式:

這個函式其實就是求乙個數n的階乘後面有幾個零的函式

2.然後就是在乙個比較大的範圍內找數字符合條件的,用二分找比較簡單

*********************************/

#includelong long facs(long long n)//第一次做這種題目可能會比較難想

return num;//這裡返回的就是乙個數n的階乘的末尾的零的個數

}int main()

if(flag==0)//如果沒有任何數字滿足的話,就輸出字元

printf("no solution\n");

}return 0;

}

這種思維性的題目訓練了也是非常好的,對於能力的提高很重要。

ZCMU 1375 階乘的零 二分

定義f n 為n!的末尾零的個數,例如f 4 0,f 5 1。你的任務是對於乙個給定的的值x找出最小的n滿足f n x。多組測試資料,每組測試資料報含乙個正整數x 1 x 10 8 對於每組測試資料輸出對應的n,若沒有n滿足則輸出 no solution 210這題一開始腦抽看成輸入n求其階乘末尾0...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...