《程式設計珠璣》看書筆記

2021-07-02 01:45:11 字數 1867 閱讀 1639

臨睡前翻看了下《程式設計珠璣(續)》這本書,看到第一章就被吸引了,效能監視工具這節從計算素數入手。題目是:

列印所有小於1000的素數

簡單直白的方法就是,針對每個小於1000的數字n,從2開始到n-1,如果能被任意乙個數整除,那它就不是素數。**如下:

int prime(int n)

return

1; }

int main()

}

這裡存在可優化的地方,優化的地方就是根本不需要計算到n-1這個大小。因為根據數論的理論,只要求得至多不大於n‾

‾√的整型數即可得出這個數是否為素數:

如下為理論證明:

第一,對於乙個自然數n,只要能被乙個非1非自身的數整除,它就肯定不是素數,所以不

必再用其他的數去除。

第二,對於n來說,只需用小於n的素數去除就可以了。例如,如果n能被15整除,實際

上就能被3和5整除,如果n不能被3和5整除,那麼n也決不會被15整除。

第三,對於n來說,不必用從2到n一1的所有素數去除,只需用小於等於√n(根號n)的所有素數去除就可以了。這一點可以用反證法來證明:

如果n是合數,則一定存在大於1小於n的整數d1和d2,使得n=d1×d2。

如果d1和d2均大於√n,則有:n=d1×d2>√n×√n=n。

而這是不可能的,所以,d1和d2中必有乙個小於或等於√n。

因此可以只求得n‾

‾√之內的數即可判斷該數是不是素數:

int root(int n)

int prime(int n)

return

1; }

int main()

}

可是這個方法還不是特別好,因為求平方根的操作比較耗費時間,因此如果能把這個時間省略就更好了,因此想到了如下辦法:

int root(int n)

int prime(int n)

return

1; }

int main()

}

是不是很驚喜啊,這樣運算速度又快了一步,不過還不是最優的,試想將乙個數先判斷是否能被2,3,5整除,那麼這個數肯定不是素數,這樣一下子剔除了好多數,然後只考慮奇數的因子,這樣時間上又優化了很多

int prime(int n)

return

1; }

int main()

}

這樣又優化了很多啊,這本書講的真實厲害!後面還有的優化就是厄拉多塞篩法

簡單介紹一下厄拉多塞篩法。厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法:先將2-n的各數放入表中,然後在2的上面畫乙個圓圈,然後劃去2的其他倍數;第乙個既未畫圈又沒有被劃去的數是3,將它畫圈,再劃去3的其他倍數;現在既未畫圈又沒有被劃去的第乙個數 是5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於n的各數都畫了圈或划去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 n的素數。

可以用乙個陣列儲存每個元素,陣列下標對應元素,此時對這個陣列進行標記,如果為某個數的倍數,就將其標記為0,之後,沒有被標記的元素就是素數。

int num[n];

for (int i = 0; i < n; i++)

for (int j = 2; j < n; j++)

} }

for (int n = 0; n < n; n++)

{ if(0 != num[n])

{ cout<<" "

《其實這還可以繼續優化,因為用陣列表示每個數,當陣列範圍較大時,占用記憶體較多,可以採用位圖法降低空間消耗。

程式設計珠璣筆記1

乙個檔案裡有1千萬 10000000 個7位的整數 小於1千萬 給大約1m記憶體讓排序 向量旋轉 abcdefgh 長度n為8 向左旋轉i 3次 某檔案包含40億個隨機次序32位整數,其中有乙個整數未出現,找出來。限制 記憶體幾百位元組,若干順序檔案。乙個詞典有230000個單詞,file和life...

讀《程式設計珠璣》筆記

程式設計珠璣 是一本很好的,經典的程式設計書。這兩天開始讀,有種 相見恨晚 的感覺。書中通過講述作者自己的親身體會來說明程式設計的藝術。很有感染力。第一章講述了乙個 號碼排序的故事。強調化蘩為簡的重要性。很多問題,咋一看挺難的,如果仔細分析轉化,可能會發現其實很簡單。第二章二分搜尋和排序在實際問題處...

《程式設計珠璣》筆記三

昨晚並沒有完成理想中的任務,同時昨天也沒有完習題第三題的解答。自己思考的結果沒有完成,並且解法二也沒有自己在機器上實現,所以今天用25分鐘來完成習題3的思考以後,便是對後面幾題的解答好了,先讀一下昨天的思考。簡單總結下昨天的思路,如下圖所示。graph td a 思路 b 自己推導 a c 同餘定理...