程式設計之美讀書筆記2 20 程式理解和時間分析

2021-06-28 02:28:45 字數 1361 閱讀 8913

1

理解這個程式就是從輸出的地方入手即可。這個程式輸出的條件是hit==2&&(hit1+1==hit2),而hit表示滿足i%r[j]!=0的條件的次數,hit==2表示這個條件只能被滿足兩次,也就是說對於乙個i,在rg陣列的30個數中,這個i能被其它28個數整除,而不能被其中兩個數整除。而hit1表示第乙個不能整除i的數的下標,hit2表示第二個不能整除i的下標,這兩個下標被要求相差只有1。

所以,程式所要尋找的是這樣的數:這個數i不能被2-31這30個數中的兩個相鄰的數整除,但能被其它 28個數整除。

這裡我們需要找到這兩個相鄰的數。設這兩個數分別為a,a+1,如果i不能被a整除,那麼,i必然不能被a的倍數整除。所以a必然大於15(因為給定的數的範圍是2-31),即i必然能夠被2-15之間的數整除,而18=2*9,20=4*5,22=2*11,。。。30=2*15。因為i必然能夠被2-15之間的數整除,所以i,必然能夠被18,20,。。。30這些數整除。那麼最後只剩下16和17。所以,所求的i肯定不能被16和17整除,同時能夠被其他28個數整除。那麼i就是其它28個數的最小公倍數的整數倍。2.

我們先把2到31中的素數都列出來(17除外):。而2到31中(16,17除外)的數都是由這些素數作為因子組合相乘得到的,其中,要得到8,至少要3個2,要得到27至少要3個3,要得到25,至少要2個5,其餘的素因子都只需乙個就夠了。

因此,這個最小的數就是 2^3, 3^3, 5^2, 7, 11, 13, 19, 23, 29, 31的乘積,答案為:2123581660200。

3.要估算時間,我們先確定乙個原子操作(或者說原子過程更合適),這裡我們取內層for迴圈裡的整個if語句塊,該段程式主要包括乙個取模操作和乙個判斷,如果進入if語句的話,還包括1次加法操作,1~2次判斷和一次賦值操作。

我們知道加法、判斷等操作基本都在幾個時鐘週期內就可以完成,而除法操作卻需要數十個時鐘週期,而取模操作也是通過除法操作得到的(還記得組合語言裡,執行除法操作之後,乙個暫存器裡存結果,另乙個暫存器裡存餘數),另外,對64位整數的除法明顯要慢於32位整數,綜合這些因素,我們可以假設該原子操作需要100個時鐘週期。因此2ghz的cpu在1秒內能跑2*10^9 / 100 = 2*10^7 即2000萬次原子操作,做過acm的同學就會有乙個直觀概念,這和我們通常做時限為1s的題時估算的計算次數差不多。

接下來估算原子操作執行的次數:外層迴圈跑了2123581660200次,內層迴圈取決於 i 的情況,當i為奇數的時候,內層最多跑5次即可結束,因為2,4,6都不能整除奇數;當i為偶數的時候,情況要複雜一些,但是也可以乙個乙個的詳細分析。這裡我們粗略估計,就算內層迴圈平均可以跑10次,外層迴圈少跑一些,去掉零頭,總的原子操作執行了2*10^13次。

所以需要 2*10^13 / (2*10^7) = 10^6秒約為277個小時。

《程式設計之美》讀書筆記

程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...

《程式設計之美》讀書筆記集錦

程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...

《程式設計之美》讀書筆記集錦

程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...