国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

藍(lán)橋杯刷題014——求階乘(二分法)

這篇具有很好參考價(jià)值的文章主要介紹了藍(lán)橋杯刷題014——求階乘(二分法)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

求階乘?

藍(lán)橋杯2022省賽題目

問(wèn)題描述

滿足?N?! 的末尾恰好有?K?個(gè) 0 的最小的?N?是多少?

如果這樣的?N?不存在輸出??1?。

輸入格式

一個(gè)整數(shù)?K?。

輸出格式

一個(gè)整數(shù)代表答案。

樣例輸入

2

樣例輸出

10

評(píng)測(cè)用例規(guī)模與約定

對(duì)于?30%?的數(shù)據(jù), 1≤K≤10^6.

對(duì)于?100%?的數(shù)據(jù), 1≤K≤10^18.

思路:?

題目大意:求滿足N!的末尾恰好有K個(gè)0的最小的N,如果這樣的N不存在,返回-1

解法一:暴力法

????????遍歷1~10^18(題目中100%的數(shù)據(jù)規(guī)模)內(nèi)所有數(shù),對(duì)每個(gè)數(shù)求階乘,再計(jì)算末尾0的個(gè)數(shù),最后判斷是否為K個(gè)0,很明顯是超時(shí)了(看下面代碼分析)。但可以得到部分的分?jǐn)?shù),沒(méi)有時(shí)間的話可以這樣簡(jiǎn)單處理。

? ? ? ? 代碼分析:這個(gè)是計(jì)算末尾0的個(gè)數(shù)的代碼,很明顯在這個(gè)環(huán)節(jié)就沒(méi)辦法達(dá)到100%數(shù)據(jù)的要求,因?yàn)?≤K≤10^18,而這個(gè)代碼復(fù)雜度是O(n),要計(jì)算10^18次,但藍(lán)橋杯計(jì)算量一般不超過(guò)10^8,所以用暴力法計(jì)算是超時(shí)的。?

res = 0     # 統(tǒng)計(jì)末尾0的個(gè)數(shù)
while m % 10 == 0:
    res+=1
    m//10    # 去掉最后一位

解法二:?

解題關(guān)鍵給出一個(gè)N,如何快速計(jì)算它的階乘中末尾0的個(gè)數(shù)?

  • 思考1:什么樣的數(shù),相乘后能夠產(chǎn)生0?

10=2*5

20=2*2*5
7200=72*2*5*2*5
我們可以發(fā)現(xiàn)每個(gè)數(shù)字末尾的每個(gè)0都可以看成是2和5相乘得到
所以我們可以對(duì)題目中樣例進(jìn)行分析:10!=1 * 2 * 3 * 4 * 5* 6 * 7 * 8 * 9 * 10,我們發(fā)現(xiàn)10!內(nèi)有一對(duì)現(xiàn)成的2和5,但樣例輸出是2,說(shuō)明還有一對(duì)2和5,沒(méi)錯(cuò),只要把10進(jìn)行分解成2*5就可以再得到一對(duì),這樣兩對(duì)2和5說(shuō)明10的階乘末尾有2個(gè)零。

結(jié)論:給定一個(gè)數(shù)的階乘,計(jì)算它的因子中2*5出現(xiàn)的次數(shù),即可確定末尾0的個(gè)數(shù)?

  • 思考:2:找2*5的數(shù)目,因子2是否需要尋找?

不需要。通過(guò)10!=1 * 2 * 3 * 4 * 5* 6 * 7 * 8 * 9 * 10可以發(fā)現(xiàn),因子5只有在5和10中才有。但因子2在2,4,6,8,10中都存在,出現(xiàn)2多5少的現(xiàn)象,所以只需要找到稀有的因子5即可,因?yàn)橐蜃?是肯定有剩余的。

問(wèn)題轉(zhuǎn)換:

求N的階乘尾部0的個(gè)數(shù)? ?? ?求N的階乘中因子5的個(gè)數(shù)
????????對(duì)階乘中的因子5進(jìn)行分析,1 2 3 4 5…10 …15…20…25…30…35… 50…55… 75…100…105…125…,可以發(fā)現(xiàn)當(dāng)?shù)?4時(shí),前面每隔5都會(huì)都會(huì)有一對(duì)2和5,共有4對(duì)。但在25時(shí)會(huì)出兩個(gè)5(兩對(duì)2和5),總共就有6對(duì),如果你輸入5的話,沒(méi)有末尾為5個(gè)0的階乘,則返回-1。在124之前每隔25會(huì)出兩對(duì),但125會(huì)出三對(duì)。把前面出現(xiàn)的5加起來(lái)總共有31個(gè),但這樣很麻煩,有沒(méi)有更容易操作的方法呢?看看下面的操作:

藍(lán)橋杯刷題014——求階乘(二分法)

?????????為什么是這樣算呢?是因?yàn)槲覀兿劝押幸粋€(gè)及以上5的25個(gè)數(shù)全部取出一個(gè)5加到總數(shù)num,那么本來(lái)一個(gè)5的數(shù)就變成0個(gè)(可以忽略),本來(lái)兩個(gè)5的數(shù)變成一個(gè)5的數(shù),本來(lái)3個(gè)5的變成二個(gè)5的。再這樣對(duì)原本含有二個(gè)及以上5的5個(gè)數(shù)(現(xiàn)在是含有一個(gè)及以上5的數(shù))操作一次,只剩下一個(gè)含5的數(shù),最后再對(duì)含5的1個(gè)數(shù)取出一個(gè)5加到總數(shù)num,這樣就把全部的因子5轉(zhuǎn)移到了總數(shù)num。

結(jié)論:求N的階乘中因子5的個(gè)數(shù),將N每次除以5求和即可。

定義求一個(gè)整數(shù)階乘末尾0的個(gè)數(shù)的函數(shù):

def cal_zero(N):
    res = 0   # 統(tǒng)計(jì)0的個(gè)數(shù)
    while N:
        N //= 5
        res += N
    return res

復(fù)雜度:每一次變成原來(lái)的五分之一,所以復(fù)雜度為,是logN級(jí)別的,計(jì)算10^18的數(shù)只需要算26次即可,非常高效!

注意:題目中 1≤K≤10^18的K是指整數(shù)階乘末尾0的個(gè)數(shù)的范圍,不是整數(shù)的范圍,說(shuō)明整數(shù)范圍可能更大,我們以10^19的整數(shù)試一下,看看階乘末尾0的個(gè)數(shù)能不能大于10^18。

def cal_zero(N):
    res = 0  # 統(tǒng)計(jì)0的個(gè)數(shù)
    while N:
        N //= 5
        res += N
    return res

N = 1e19
print(cal_zero(N))  # 2.5e+18

????????很顯然,10^19的整數(shù)階乘末尾有2.5e+18個(gè)0,大于題目100%數(shù)據(jù)大小,是滿足要求的。所以N可以取10^19來(lái)計(jì)算。

????????上面只是求出了整數(shù)階乘末尾0的個(gè)數(shù),還需要找出滿足末尾K個(gè)0的最小整數(shù),下面用二分法來(lái)求解。

二分法登場(chǎng)啦!

使用條件:更小的N對(duì)應(yīng)的是小的尾0個(gè)數(shù),更大的N對(duì)應(yīng)的是大的0個(gè)數(shù),所以末尾0的個(gè)數(shù)是一個(gè)遞增的有序數(shù)列,可以用二分法來(lái)求解。
定義一個(gè)check()函數(shù):將所有從1到N的階乘分成尾部0個(gè)數(shù)<k的左半部分和>=k的右半部分,二分結(jié)束后檢查R位置(因?yàn)镽是滿足≥check()的最小值)的尾部0個(gè)數(shù)是否為k即可,若不是即返回-1。

藍(lán)橋杯刷題014——求階乘(二分法)

def check(k):
    L,R=1,int(1e19)    
    while L+1!=R:
        mid = (L+R)//2
        if cal_zero(mid)>=k:    
            R = mid
        else:
            L=mid
    if cal_zero(R)==k:  # cal_zero(r):滿足階乘末尾0≥k的最小整數(shù)
      return R
    else:               # 沒(méi)有階乘末尾k個(gè)0的整數(shù)
      return -1   

?二分法的復(fù)雜度也是O(logN),所以算法復(fù)雜度為文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-411613.html

代碼演示:?

k=int(input())
def cal_zero(N):
    res = 0   # 統(tǒng)計(jì)末尾0的個(gè)數(shù)
    while N:
        N //= 5
        res += N
    return res
def check(k):
    L,R=1,int(1e19)    
    while L+1!=R:
        mid = (L+R)//2
        if cal_zero(mid)>=k:    
            R = mid
        else:
            L=mid
    if cal_zero(R)==k:  # cal_zero(r):滿足階乘末尾0≥k的最小整數(shù)
      return R
    else:               # 沒(méi)有階乘末尾k個(gè)0的整數(shù)
      return -1   
print(check(k))

到了這里,關(guān)于藍(lán)橋杯刷題014——求階乘(二分法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 二分法相關(guān)使用

    二分法相關(guān)使用

    在線OJ:704. 二分查找 有序數(shù)組下的二分思路如下: 由于這里是有序數(shù)組, 我們可以可以先得到中點(diǎn)位置, 中點(diǎn)可以把數(shù)組分為左右兩邊; 如果中點(diǎn)位置的值等于目標(biāo)值, 直接返回中點(diǎn)位置; 如果中點(diǎn)位置的值小于目標(biāo)值, 則去數(shù)組中點(diǎn)左側(cè)按同樣的方式查找; 如果中點(diǎn)位置的值大

    2024年02月07日
    瀏覽(17)
  • 二分法MATLAB代碼

    二分法MATLAB代碼

    本質(zhì)是通過(guò)不斷進(jìn)行區(qū)間壓縮來(lái)獲取函數(shù)零點(diǎn)。 二分法的終止條件:區(qū)間長(zhǎng)度小于等于精度要求 。 流程: 如下圖所示:

    2024年02月05日
    瀏覽(23)
  • 初探二分法

    初探二分法

    智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(一) 智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(二) 題目:給定一個(gè) n 個(gè)元素有序的(升序)整型數(shù)組 nums 和一個(gè)目標(biāo)值 target ,寫一個(gè)函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。 提示: 你可以

    2024年01月25日
    瀏覽(23)
  • 【算法】—二分法詳解

    【算法】—二分法詳解

    ①定義: 二分查找算法也稱折半搜索算法,對(duì)數(shù)搜索算法,是一種在 有序數(shù)組 中查找某一特定元素的搜索算法。搜索過(guò)程從數(shù)組的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜索過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素

    2024年02月09日
    瀏覽(25)
  • 【二分查找】一文帶你掌握二分法 (附萬(wàn)能模板)

    【二分查找】一文帶你掌握二分法 (附萬(wàn)能模板)

    一、簡(jiǎn)介 哪怕沒(méi)有學(xué)過(guò)編程的同學(xué),也許不知道二分法這個(gè)名字,但也一定接觸過(guò)它的核心思想。不了解的同學(xué)也沒(méi)關(guān)系,我用一句話就能概括出它的精髓: 將一個(gè)區(qū)間一分為二,每次都舍棄其中的一部分。 二分法能夠極大地降低我們?cè)诮鉀Q問(wèn)題時(shí)的時(shí)間復(fù)雜度。假如你要

    2024年01月19日
    瀏覽(23)
  • 牛頓法、割線法、二分法

    牛頓法、割線法、二分法

    牛頓法求解非線性方程組 割線法求解非線性方程組 二分法求解根號(hào)3 ?另外,今天上機(jī)課寫程序時(shí),發(fā)現(xiàn)不同的起始點(diǎn)可以收斂到不同的零點(diǎn)。也許這是一個(gè)新的值得研究的地方。 看來(lái),計(jì)算數(shù)學(xué)也是這樣,光聽(tīng)理論無(wú)法實(shí)現(xiàn)大的突破,也沒(méi)法產(chǎn)生好的想法,必須在實(shí)踐應(yīng)用

    2024年02月05日
    瀏覽(25)
  • 【劍指Offer】二分法例題

    【劍指Offer】二分法例題

    鏈表是數(shù)據(jù)結(jié)構(gòu)中重要的一個(gè)章節(jié),他的重要性也不言而喻,在未來(lái)不管是筆試還是面試都會(huì)遇到這類的題目,所以接下來(lái)我就會(huì)把一些鏈表的常考的題目全部整理出來(lái)供大家學(xué)習(xí)指正。 題目鏈接 描述: 給定一個(gè)長(zhǎng)度為n的數(shù)組nums,請(qǐng)你找到峰值并返回其索引。數(shù)組可能包

    2023年04月13日
    瀏覽(20)
  • 非線性方程二分法

    優(yōu)點(diǎn):算法直觀、簡(jiǎn)單、總能保證收斂;局限:收斂速度慢、一般不單獨(dú)用它求根,僅為了獲取根的粗略近似 設(shè) f ( x ) f(x) f ( x ) 在 [ a , b ] [a,b] [ a , b ] 上連續(xù)、嚴(yán)格單調(diào)、滿足條件 f ( a ) f ( b ) 0 f(a)f(b)0 f ( a ) f ( b ) 0 則在區(qū)間 [ a , b ] [a,b] [ a , b ] 內(nèi)必有一根 x ? x^* x ? 。通

    2024年02月04日
    瀏覽(28)
  • 1241:二分法求函數(shù)的零點(diǎn)

    【題目描述】 有函數(shù):f(x)=x5?15x4+85x3?225x2+274x?121 已知f(1.5)0,f(2.4)0 且方程f(x)=0在區(qū)間[1.5,2.41.5,2.4] 有且只有一個(gè)根,請(qǐng)用二分法求出該根。 【輸入】 (無(wú)) 【輸出】 該方程在區(qū)間[1.5,2.41.5,2.4]中的根。要求四舍五入到小數(shù)點(diǎn)后66位。 【輸入樣例】 【輸出樣例】 【AC代碼】

    2024年01月25日
    瀏覽(21)
  • 06-C++ 基本算法 - 二分法

    06-C++ 基本算法 - 二分法

    在這個(gè)筆記中,我們將介紹二分法這種基本的算法思想,以及它在 C++ 中的應(yīng)用。我們將從一個(gè)小游戲猜數(shù)字開(kāi)始,通過(guò)這個(gè)案例來(lái)引出二分法的概念。然后我們將詳細(xì)講解什么是二分法以及它的套路和應(yīng)用。最后,我們還會(huì)介紹 C++ STL 中的二分查找函數(shù)。讓我們一起來(lái)探索

    2024年02月16日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包