• <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   管理


            特殊功能
             
            99久久久国产精品免费无卡顿| 久久久久亚洲AV片无码下载蜜桃| 久久久亚洲裙底偷窥综合| 国产精品gz久久久| 国产精品日韩深夜福利久久| 伊人久久精品线影院| 国产成人精品久久亚洲| 99久久久久| 四虎国产精品成人免费久久| 无码精品久久一区二区三区| 色偷偷88欧美精品久久久| 亚洲欧美日韩久久精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产成人久久精品麻豆一区| 97超级碰碰碰碰久久久久| 2020最新久久久视精品爱 | 日本人妻丰满熟妇久久久久久| 亚洲va久久久噜噜噜久久男同| 久久久久人妻一区精品性色av| 97久久超碰国产精品2021| 国产福利电影一区二区三区久久久久成人精品综合 | 日韩精品国产自在久久现线拍| 久久久久国产一级毛片高清板| 天天影视色香欲综合久久| 久久久久久久波多野结衣高潮| 久久综合精品国产二区无码| 久久久久久免费一区二区三区| 久久人人爽人人澡人人高潮AV | 久久国产亚洲精品麻豆| 韩国三级中文字幕hd久久精品| 亚洲午夜无码AV毛片久久| 久久久久久久97| 久久天天躁狠狠躁夜夜av浪潮| 久久久亚洲裙底偷窥综合| 国产精品一久久香蕉国产线看| 日韩久久久久中文字幕人妻| 久久久久人妻一区二区三区vr| 狠狠精品久久久无码中文字幕 | 精品伊人久久大线蕉色首页| 国产99久久久久久免费看| 久久国产亚洲精品无码|