最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

千萬(wàn)不要被階乘嚇倒

 更新時(shí)間:2013年05月23日 17:57:36   作者:  
本篇文章是對(duì)階乘進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
階乘(Factorial)是個(gè)很有意思的函數(shù),但是不少人都比較怕它,我們來(lái)看看兩個(gè)與階乘相關(guān)的問(wèn)題:
1、 給定一個(gè)整數(shù)N,那么N的階乘N!末尾有多少個(gè)0呢?例如:N=10,N?。? 628 800,N!的末尾有兩個(gè)0。
2、求N!的二進(jìn)制表示中最低位1的位置。
有些人碰到這樣的題目會(huì)想:是不是要完整計(jì)算出N!的值?如果溢出怎么辦?事實(shí)上,如果我們從"哪些數(shù)相乘能得到10"這個(gè)角度來(lái)考慮,問(wèn)題就變得簡(jiǎn)單了。
首先考慮,如果N!= K×10^M,且K不能被10整除,那么N!末尾有M個(gè)0。再考慮對(duì)N!進(jìn)行質(zhì)因數(shù)分解,N!=(2^x)×(3^y)×(5^z)…,由于10 = 2×5,所以M只跟X和Z相關(guān),每一對(duì)2和5相乘可以得到一個(gè)10,于是M = min(X, Z)。不難看出X大于等于Z,因?yàn)槟鼙?整除的數(shù)出現(xiàn)的頻率比能被5整除的數(shù)高得多,所以把公式簡(jiǎn)化為M = Z。
根據(jù)上面的分析,只要計(jì)算出Z的值,就可以得到N!末尾0的個(gè)數(shù)。
【問(wèn)題1的解法一】
要計(jì)算Z,最直接的方法,就是計(jì)算i(i =1, 2, …, N)的因式分解中5的指數(shù),然后求和:
復(fù)制代碼 代碼如下:

ret = 0;
for(i = 1; i <= N; i++)
{
 j = i;
 while(j % 5 ==0)
 {
  ret++;     //統(tǒng)計(jì)N的階乘中那些能夠被5整除的因子的個(gè)數(shù)
  j /= 5;
 }
}

【問(wèn)題1的解法二】
公式:Z = [N/5] +[N/5^2] +[N/5^3] + …(不用擔(dān)心這會(huì)是一個(gè)無(wú)窮的運(yùn)算,因?yàn)榭偞嬖谝粋€(gè)K,使得5^K > N,[N/5^K]=0。)
公式中,[N/5]表示不大于N的數(shù)中5的倍數(shù)貢獻(xiàn)一個(gè)5,[N/5^2]表示不大于N的數(shù)中5^2的倍數(shù)再貢獻(xiàn)一個(gè)5,……代碼如下:
復(fù)制代碼 代碼如下:

ret = 0;
while(N)
{
 ret += N / 5;
 N /= 5;
}

問(wèn)題2要求的是N!的二進(jìn)制表示中最低位1的位置。給定一個(gè)整數(shù)N,求N!二進(jìn)制表示的最低位1在第幾位?例如:給定N = 3,N!= 6,那么N!的二進(jìn)制表示(1 010)的最低位1在第二位。
為了得到更好的解法,首先要對(duì)題目進(jìn)行一下轉(zhuǎn)化。
首先來(lái)看一下一個(gè)二進(jìn)制數(shù)除以2的計(jì)算過(guò)程和結(jié)果是怎樣的。
把一個(gè)二進(jìn)制數(shù)除以2,實(shí)際過(guò)程如下:
判斷最后一個(gè)二進(jìn)制位是否為0,若為0,則將此二進(jìn)制數(shù)右移一位,即為商值(為什么);反之,若為1,則說(shuō)明這個(gè)二進(jìn)制數(shù)是奇數(shù),無(wú)法被2整除(這又是為什么)。
所以,這個(gè)問(wèn)題實(shí)際上等同于求N!含有質(zhì)因數(shù)2的個(gè)數(shù)+1。即答案等于N!含有質(zhì)因數(shù)2的個(gè)數(shù)加1。 實(shí)際上N!都為偶數(shù),因?yàn)橘|(zhì)因數(shù)里面都有一個(gè)2,除了1以外,因?yàn)?的階乘是1,是個(gè)奇數(shù),其他數(shù)的階乘都是偶數(shù)。。
【問(wèn)題2的解法一】
由于N! 中含有質(zhì)因數(shù)2的個(gè)數(shù),等于 N/2 + N/4 + N/8 + N/16 + …[1],
根據(jù)上述分析,得到具體算法,如下所示:
復(fù)制代碼 代碼如下:

/*
可以先求出N!中2的個(gè)數(shù)(因?yàn)槊看嬖谝粋€(gè)2,則在數(shù)的
最低位多1個(gè)0)。因此求1的最低位的位置即為N!中2的個(gè)數(shù)+1;
*/
int lowestOnePos(int n)
{
&nbsp;&nbsp; &nbsp;int ret = 0;&nbsp;&nbsp;&nbsp;&nbsp; //統(tǒng)計(jì)n!中含有質(zhì)因數(shù)2的個(gè)數(shù)
&nbsp;&nbsp; &nbsp;while(n)
&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;n >>= 1;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ret += n;
&nbsp;&nbsp; &nbsp;}
&nbsp;&nbsp; &nbsp;return ret+1;
}

【問(wèn)題2的解法二】
N!含有質(zhì)因數(shù)2的個(gè)數(shù),還等于N減去N的二進(jìn)制表示中1的數(shù)目。我們還可以通過(guò)這個(gè)規(guī)律來(lái)求解。
下面對(duì)這個(gè)規(guī)律進(jìn)行舉例說(shuō)明,假設(shè) N = 11011,那么N!中含有質(zhì)因數(shù)2的個(gè)數(shù)為 N/2 + N/4 + N/8 + N/16 + …
復(fù)制代碼 代碼如下:

即: 1101 + 110 + 11 + 1
=(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1
=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1
= 1111 + 111 + 1
=(10000 -1)+(1000 - 1)+(10-1)+(1-1)
= 11011-N二進(jìn)制表示中1的個(gè)數(shù)

小結(jié)
任意一個(gè)長(zhǎng)度為m的二進(jìn)制數(shù)N可以表示為N = b[1] + b[2] * 2 + b[3] * 22 + … + b[m] * 2(m-1),其中b [ i ]表示此二進(jìn)制數(shù)第i位上的數(shù)字(1或0)。所以,若最低位b[1]為1,則說(shuō)明N為奇數(shù);反之為偶數(shù),將其除以2,即等于將整個(gè)二進(jìn)制數(shù)向低位移一位。
相關(guān)題目
給定整數(shù)n,判斷它是否為2的方冪(解答提示:n>0&&((n&(n-1))==0))。
--------------------------------------------------------------------------------
[1] 這個(gè)規(guī)律請(qǐng)讀者自己證明(提示N/k,等于1, 2, 3, …, N中能被k整除的數(shù)的個(gè)數(shù))。

相關(guān)文章

  • C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    這篇文章主要介紹了C語(yǔ)言中如何通過(guò)指針參數(shù)返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼

    Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法

    C語(yǔ)言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法,結(jié)合具體實(shí)例形式分析了插入排序與直接選擇排序的定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • 將?C++?類(lèi)型屬性暴露給?QML

    將?C++?類(lèi)型屬性暴露給?QML

    這篇文章主要介紹了將?C++?類(lèi)型屬性暴露給?QML,?QML?是一種基于?JavaScript?的聲明式語(yǔ)言。在?Qt5中,QML有了長(zhǎng)足進(jìn)步,并且同?C++?并列成為?Qt?的首選編程語(yǔ)言下面一起進(jìn)入文章學(xué)習(xí)?QML的條件下也看看如何將將?C++?類(lèi)型屬性暴露給?QML,需要的朋友可以參考一下
    2021-12-12
  • Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++核心編程之內(nèi)存分區(qū)模型詳解

    C++核心編程之內(nèi)存分區(qū)模型詳解

    這篇文章主要為大家介紹了C++核心編程中內(nèi)存分區(qū)模型,C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個(gè)區(qū)域,代碼區(qū),全局區(qū),棧區(qū),堆區(qū),文章通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考閱讀下
    2023-07-07
  • C++私有繼承(一)

    C++私有繼承(一)

    這篇文章主要介紹了C++私有繼承,在私有繼承當(dāng)中,基類(lèi)的公有成員和保護(hù)成員都會(huì)成為派生類(lèi)的私有成員。這意味著基類(lèi)的方法都會(huì)被private關(guān)鍵字描述,我們可以在派生類(lèi)中使用它,但類(lèi)對(duì)象無(wú)法直接調(diào)用,下面來(lái)看看詳細(xì)內(nèi)容吧
    2022-01-01
  • 對(duì)C++默認(rèn)構(gòu)造函數(shù)的一點(diǎn)重要說(shuō)明

    對(duì)C++默認(rèn)構(gòu)造函數(shù)的一點(diǎn)重要說(shuō)明

    下面小編就為大家?guī)?lái)一篇對(duì)C++默認(rèn)構(gòu)造函數(shù)的一點(diǎn)重要說(shuō)明。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • c語(yǔ)言實(shí)現(xiàn)基數(shù)排序解析及代碼示例

    c語(yǔ)言實(shí)現(xiàn)基數(shù)排序解析及代碼示例

    這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)基數(shù)排序解析及代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 深入了解C++優(yōu)先隊(duì)列(priority_queue)的使用方法

    深入了解C++優(yōu)先隊(duì)列(priority_queue)的使用方法

    在計(jì)算機(jī)科學(xué)中,優(yōu)先隊(duì)列是一種抽象數(shù)據(jù)類(lèi)型,它與隊(duì)列相似,但是每個(gè)元素都有一個(gè)相關(guān)的優(yōu)先級(jí)。C++中的優(yōu)先隊(duì)列是一個(gè)容器適配器(container adapter),它提供了一種在元素之間維護(hù)優(yōu)先級(jí)的方法。本文帶你深入了解C++優(yōu)先隊(duì)列的使用方法,需要的可以參考下
    2023-05-05

最新評(píng)論

孝昌县| 美姑县| 易门县| 许昌县| 香河县| 治县。| 扎囊县| 清河县| 额敏县| 敦煌市| 威宁| 抚宁县| 荃湾区| 门源| 涞源县| 浪卡子县| 上高县| 瑞金市| 临泉县| 高邮市| 汉沽区| 万州区| 马山县| 汕头市| 永修县| 定陶县| 广州市| 古交市| 蓝田县| 康马县| 凤城市| 六盘水市| 平顶山市| 南安市| 西和县| 青川县| 来安县| 乌鲁木齐市| 孙吴县| 内丘县| 武邑县|