• <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記錄開發新知道

            編程之美P117學習筆記

            編程之美P117 -

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

                等價于

                因為54 >250,也就是最后一個加號以后的數在計算機的整數除法中均為0,因此只有前三個有效。

                等價于

                它們分別可以解釋為:

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

                :每間隔5,一共有多少個數,其結果也就是整除5的結果

                :每間隔25,一共有多少個數,其結果也就是整除25的結果,因為之前這些數已經參與了含有5的計算,因此,現在整除25也就是整除5×5,則表示它有兩個5相乘。

                依此類推,即可得出5的個數。

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

              給定一個十進制正整數N,寫下從1開始,到N的所有整數,然后數一下其中出現的所有1的個數。

              1. 遍歷每個數,求每個數含有1的個數,但效率低,時間復雜度為O(N*log2N)
              2. P115
            5. 數組int array[]中,最大的N個數。
              1. 排序?但是數字一大肯定不可以。
              2. 快速排序法,時間復雜度O(N*log2K),因為是求K個數,而快速排序一次可以將數分成兩組,最佳狀態是一次就將其分成兩組{K}X{N-K},其中X為參考數值。
              3. 二分搜索法
              4. 用容量為K的最小堆來做,使堆頂的元素是K個數中最小,然后其他數進行比較,如果比堆頂的大就替換最小的數,并重新排序堆,……,最后堆中的數據就是所要地數據了。
              5. (快,但是受限)將每個數出現的次數記錄一下,假設有3、8、10,每個數出現的次數分別是2、7、3,那么假設K取5,則分別是{10、10、10、8、8}。
            6. 最大公約數
              1. 輾轉相除法
              2. 求差判定法,用減法代替方法1中的取模運算,但增加了迭代次數
              3. 根據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順序不能錯;

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

            }

            ?

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

            {

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

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

            ????// 也就是說迭代次數較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) 評論(0)  編輯 收藏 引用

            特殊功能
             
            26uuu久久五月天| 免费精品久久天干天干| 久久久无码人妻精品无码| 精品久久久久久久无码 | 国产午夜福利精品久久| 狠狠综合久久综合88亚洲| 国产精品乱码久久久久久软件| 久久亚洲精品无码观看不卡| 精品久久一区二区三区| 亚洲精品成人久久久| 婷婷综合久久狠狠色99h| 亚洲中文字幕久久精品无码喷水| 久久久久人妻精品一区| 久久久精品久久久久特色影视| 久久99精品综合国产首页| 日本加勒比久久精品| 精品国产乱码久久久久久郑州公司| 99久久精品国产一区二区三区 | 青青国产成人久久91网| 2021最新久久久视精品爱| 亚洲嫩草影院久久精品| 久久精品国产乱子伦| 久久精品一区二区三区中文字幕| 欧美丰满熟妇BBB久久久| 日日噜噜夜夜狠狠久久丁香五月 | 亚洲国产精品无码久久| 久久久久久国产精品无码下载| 99麻豆久久久国产精品免费 | 久久久久人妻精品一区二区三区| 亚洲精品久久久www| Xx性欧美肥妇精品久久久久久| 99久久这里只有精品| 天堂久久天堂AV色综合| 久久久久久曰本AV免费免费| 久久www免费人成精品香蕉| 91精品久久久久久无码| 久久99精品久久久久久| 久久96国产精品久久久| …久久精品99久久香蕉国产| 久久精品国产亚洲av麻豆小说| 久久亚洲精品无码AV红樱桃|