第2章 數字之魅 數字中的技巧2 1

2022-03-16 08:15:22 字數 1484 閱讀 2046

法1:整型數觀念。

二進位制中1在數中的體現,也就是當乙個數是奇數時最末位就是1。那麼我們可以將乙個數判斷是否是奇數。如果是就統計加1。並且/2 失去這一位。

int

count;

count = 0

;void count(int

num)

num /= 2

; }

}

法1法2:從二進位制的角度。

利用位運算。從二進位制的角度對數進行1的統計。

熟悉位運算的用法。暫時介紹 & 按位與 和 >> << 。對於<< >>不過多介紹,就是位的前進的後退。可以理解: >>n 是 /pow(2,n)。

實質上是: 1&0=0 0&0=0 1&1=1

運算舉例:1010&1110=1000

有一種用法是取某位。如果取第一位也就是0000001也就是1。

int

count;

count = 0

;void count(int

num)

}

法2法3:利用&的特殊用法。演算法時間複雜度根據1的個數的線性時間。

對於&我們不是說了它有一種用處是取位嗎?那我們是否可以

num&?=直接可以刪除掉最後一位的1呢?答案當然是有的。我們利用逆向思維。來觀察這個?滿足什麼樣的特點。這是十分常用的思想方法。

1010&x=1000 x = 1?0?(式子裡的問號的意思是可以0也可以是1)

1100&x=1000 x = 10??

1110&x=1100 x = 110? 

假若第乙個式子1?0? 第二個?假若是0。我們可以發現乙個關係。x和num本身的關係。只要num最後的1那一位變成0。前1前面位的數都保留不變。而1後面的由於num的1後面都是0。而滿足這種關係的。只要num-1。因為num最後一位後面的數都是0。(當然1也可以是最後一位)。

舉例:1100 - 1 =1001。1110-1 =1101。1010-1 =1001。

int

count;

count = 0

;void count(int

num)

}

法3在本章節,還使用了查表法。(分支操作不講)。也就是打表。因為byte只有8位 2^8 = 256個狀態。完全可以打表。簡單hash。所以對於狀態數量一定且可以實現的時候完全可以考慮這方面。來用空間換時間。以及這裡有位運算的學習。還有逆向思維。和不同角度來觀察乙個數。另外主要是記錄學習程式設計之美給我帶來的思維上的躍進。

根據後文**的演算法時間分析。打表法並沒有想象中那麼快。而且同時這提醒了我解法一也不過8次的迴圈。但我想我們也得考慮一下程式的適用性。

第2章 數字之魅 數字中的技巧2 2

問題1 求 n!末尾有多少個0。問題2 n!中二進位制表示中最低位1的位置。首先對於問題1 對於n!的末尾有多少個0這個問題。要追溯到算術基本定理 任何乙個大於1的自然數 n,都可以唯一分解成有限個質數的乘積 n p 1 a1 p 2 a2 p n an 這裡p 1質數 其諸方冪 ai 是正整數。m...

第2章 數字之魅 區間重合判斷

具體 如下 1 package chapter2shuzizhimei.qujianchonghe 2 3 區間重合判斷4 author dell5 6 7public class intervaloverlap 16 1718 快速排序的一次劃分 19public static int parti...

第2章 數字之魅 子陣列的最大乘積

給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。我們把所有可能的 n 1 個數的組合找出來,分別計算它們的乘積,並比較大小。由於總共有n個 n 1 個數的組合,總的時間複雜度為o n2 但顯然這不是最好的解法。具體 如下 ...