定義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 ...