• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            編程之美P117學(xué)習(xí)筆記

            編程之美P117 -

            1. 求二進(jìn)制中1的個(gè)數(shù)(P119)
              1. 除以一個(gè)2,如果有余,則有一個(gè)1,如果沒有余數(shù),則有一個(gè)0;
              2. 位運(yùn)算,循環(huán)右移,當(dāng)前值&0x01,要么為0,要么為1,求和,即可得1的個(gè)數(shù);
              3. 位運(yùn)算,二進(jìn)制-1,將會(huì)使最靠右的一個(gè)1消失,使其右邊那個(gè)0(如果存在的話)變1,然后與原數(shù)做&運(yùn)算,結(jié)果如果非0,則說(shuō)明還有1存在;
              4. (低效)switch運(yùn)算,直接給出答案0~255(可求8位二進(jìn)制);
              5. (神效)將結(jié)果放入int[256]中,直接查表即可,時(shí)間復(fù)雜度O(1)
            2. 階乘,給定一個(gè)整數(shù)N,那么N的階乘N!末尾有多少個(gè)0呢?例如:N=10,N!=3628800,N!的末尾有兩個(gè)。(P126)
              1. N!中0的個(gè)數(shù)就是10的個(gè)數(shù),因?yàn)?0 = 2×5,由于2可能出現(xiàn)的個(gè)數(shù)肯定比5要多很多倍,所以只要計(jì)算含有5的個(gè)數(shù)即可。所以方法1就是%5(對(duì)5取余數(shù));
              2. 原理同方法1,但是計(jì)算方式不同,一個(gè)數(shù)假設(shè)是250由幾個(gè)5相乘呢?

                等價(jià)于

                因?yàn)?4 >250,也就是最后一個(gè)加號(hào)以后的數(shù)在計(jì)算機(jī)的整數(shù)除法中均為0,因此只有前三個(gè)有效。

                等價(jià)于

                它們分別可以解釋為:

                1…5…10…15…25…30……250

                :每間隔5,一共有多少個(gè)數(shù),其結(jié)果也就是整除5的結(jié)果

                :每間隔25,一共有多少個(gè)數(shù),其結(jié)果也就是整除25的結(jié)果,因?yàn)橹斑@些數(shù)已經(jīng)參與了含有5的計(jì)算,因此,現(xiàn)在整除25也就是整除5×5,則表示它有兩個(gè)5相乘。

                依此類推,即可得出5的個(gè)數(shù)。

            3. 求N!的二進(jìn)制表示中最低位1的位置。
              1. 同上一題一樣的方式解,把5換成2即可。題目的意思也就是類似,二進(jìn)制的末尾0表示含有2的個(gè)數(shù)(類似上題含有5的個(gè)數(shù))所以最后一個(gè)1的位置必然等于0的個(gè)數(shù)+1;更高效一點(diǎn)的就是上一題需用/5的做法,而這一題用>>=的做法就可以實(shí)現(xiàn)/2的效果了,而移位比除法要高效得多;
              2. N!含有質(zhì)因數(shù)2的個(gè)數(shù),還等于N減去N的二進(jìn)制表示中1的數(shù)目。(具體分析見P128)
            4. 1的數(shù)目

              給定一個(gè)十進(jìn)制正整數(shù)N,寫下從1開始,到N的所有整數(shù),然后數(shù)一下其中出現(xiàn)的所有1的個(gè)數(shù)。

              1. 遍歷每個(gè)數(shù),求每個(gè)數(shù)含有1的個(gè)數(shù),但效率低,時(shí)間復(fù)雜度為O(N*log2N)
              2. P115
            5. 數(shù)組int array[]中,最大的N個(gè)數(shù)。
              1. 排序?但是數(shù)字一大肯定不可以。
              2. 快速排序法,時(shí)間復(fù)雜度O(N*log2K),因?yàn)槭乔驥個(gè)數(shù),而快速排序一次可以將數(shù)分成兩組,最佳狀態(tài)是一次就將其分成兩組{K}X{N-K},其中X為參考數(shù)值。
              3. 二分搜索法
              4. 用容量為K的最小堆來(lái)做,使堆頂?shù)脑厥荎個(gè)數(shù)中最小,然后其他數(shù)進(jìn)行比較,如果比堆頂?shù)拇缶吞鎿Q最小的數(shù),并重新排序堆,……,最后堆中的數(shù)據(jù)就是所要地?cái)?shù)據(jù)了。
              5. (快,但是受限)將每個(gè)數(shù)出現(xiàn)的次數(shù)記錄一下,假設(shè)有3、8、10,每個(gè)數(shù)出現(xiàn)的次數(shù)分別是2、7、3,那么假設(shè)K取5,則分別是{10、10、10、8、8}。
            6. 最大公約數(shù)
              1. 輾轉(zhuǎn)相除法
              2. 求差判定法,用減法代替方法1中的取模運(yùn)算,但增加了迭代次數(shù)
              3. 根據(jù)f(x,y) = f(p*x1,y)=f(x1,y),用移位的方式除2(>>=)

                ?

            Math::gcdNum_t Math::Gcd1(Math::gcdNum_t x, Math::gcdNum_t y)

            {

            ????//y, x%y順序不能錯(cuò);

            ????return y ? Gcd1(y, x % y) : x;

            }

            ?

            Math::gcdNum_t Math::Gcd2(Math::gcdNum_t x, Math::gcdNum_t y)

            {

            ????//Gcd1相同的方式,但由于x%y計(jì)算速度較x-y要慢,但效果相同,所以換用x - y

            ????// 但用減法和除法不同的是,比如和,%20=10-20=70,也就是-4×=10

            ????// 也就是說(shuō)迭代次數(shù)較Gcd1而言通常是增加了。

            ????return y ? Gcd1(y, x - y) : x;

            }

            ?

            Math::gcdNum_t Math::Gcd3(Math::gcdNum_t x, Math::gcdNum_t y)

            {

            ????if(x < y)

            ????????return Gcd3(y, x);

            ????if(y == 0)

            ????????return x;

            ????else

            ????{

            ????????if(IsEven(x))

            ????????{

            ????????????if(IsEven(y))

            ????????????????return (Gcd3(x >> 1, y >> 1) << 1);

            ????????????else

            ????????????????return Gcd3(x >> 1, y);

            ????????}

            ????????else

            ????????{

            ????????????if(IsEven(y))

            ????????????????return Gcd3(x, y >> 1);

            ????????????else

            ????????????????return Gcd3(y, x - y);

            ????????}

            ????}

            }

            ?

            bool Math::IsEven(Math::gcdNum_t x)

            {

            ????return !(bool)x & 0x0001;

            }

            posted on 2009-05-03 20:47 volnet 閱讀(265) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            特殊功能
             
            亚洲色欲久久久久综合网| 国产精品美女久久福利网站| 久久97精品久久久久久久不卡| 青青草原综合久久| 国产精品成人久久久| 国产精品禁18久久久夂久| 国产亚州精品女人久久久久久| A级毛片无码久久精品免费| 91久久福利国产成人精品| 国产毛片欧美毛片久久久| 国产精品九九久久免费视频 | 97久久超碰国产精品2021| 国产真实乱对白精彩久久| 久久精品国产亚洲AV无码偷窥| 久久久久久国产精品免费免费| 91精品国产综合久久久久久| 久久久无码精品午夜| 欧美精品一区二区精品久久| 久久久久久九九99精品| 色婷婷综合久久久久中文字幕| 曰曰摸天天摸人人看久久久| 国产成人久久AV免费| 久久亚洲精品国产精品| 久久久久亚洲av综合波多野结衣| 久久久久无码精品| 国产精品热久久毛片| 久久ww精品w免费人成| 色欲久久久天天天综合网| 久久一本综合| 久久久综合香蕉尹人综合网| 国产精品欧美久久久久天天影视| 久久久久久久综合日本亚洲| 97久久香蕉国产线看观看| 久久久久久人妻无码| 国内精品久久久久影院日本| 欧美亚洲色综久久精品国产| 欧美熟妇另类久久久久久不卡| 久久久久高潮毛片免费全部播放| 午夜精品久久久久久久| 亚洲va中文字幕无码久久| 久久天天躁狠狠躁夜夜网站 |