程式設計之美之程式理解和時間分析

2021-07-02 12:48:33 字數 1206 閱讀 6904

這是《程式設計之美》的2.20題目,給出一段c#**,要求不用電腦,理解程式並回答問題。下面是從c#**中改寫成的c++**:

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

intmain() ;  

for(

__int64

i =1; i < numeric_limits<

__int64

>::max(); i++)  else

if(hit == 2)  else

break

;  }  

}  if

(hit == 2 && hit1+1==hit2)   

}  return

0;  

}    

理解這個程式就是從輸出的地方往前追溯就可以。這個程式輸出的條件是hit==2&&(hit1+1==hit2),再往前追溯看hit,hit1,hit2三個變數分別代表什麼,hit表示滿足i%r[j]!=0的條件的次數,hit==2表示這個條件只能被滿足兩次,也就是說對於乙個i,在rg陣列的30個數中,這個i能被其它28個數整除,而不能被其中兩個數整除。而hit1表示第乙個不能整除i的數的下標,hit2表示第二個不能整除i的下標,這兩個下標被要求相差只有1。於是,程式所要尋找的是這樣的數:這個數i不能被2-31這30個數中的兩個相鄰的數整除,但能被其它28個數整除。所以,這個i肯定是其它28個數的最小公倍數的整數倍。然而i不能被兩個相鄰的數整除,所以必然是分解質因子後要麼i的質因子中不包括這兩個數的質因子,要麼是i的質因子的次數小於這兩個數中相同質因子的次數。

那麼,只需要給2-31這30個數分解質因數,找一下是否有這樣的相鄰的兩個數,要麼它們的質因子中有其它數沒有的質因子,要麼對於相同的乙個質因子,這兩個數包含這個質因子的次數高於其它所有次數。為此建立一張表如下:

由上表中可以看出,只有16、17、19、23、25、27、29、31這幾個數包含次數最高的質因子。而相鄰的則只有16,17。所以,這段程式所要求的數i就是,它不能被16、17整除,但能被30個數中的其它28個數整除,最小的i就是其它28個數的最小公倍數,從上表中知道,這個最小的i是:23*33*52*7*11*13*19*23*29*31,用計算器計算出這個數是:2123581660200。可以把上述程式中的for迴圈中的i初始化成這個數來檢驗。

程式設計之美 2 20 程式理解和時間分析

最近在看 程式設計之美 為找工作面試做準備。該書中2.20程式理解和時間分析一題沒有給出解答,所以簡單寫一下我自己的答案。題目如下 閱讀以下c 回答問題 csharp view plain copy using system using system.collections.generic usin...

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

1 理解這個程式就是從輸出的地方入手即可。這個程式輸出的條件是hit 2 hit1 1 hit2 而hit表示滿足i r j 0的條件的次數,hit 2表示這個條件只能被滿足兩次,也就是說對於乙個i,在rg陣列的30個數中,這個i能被其它28個數整除,而不能被其中兩個數整除。而hit1表示第乙個不能...

程式理解和時間分析

程式設計之美 第2.20節 程式理解和時間分析 題目如下 閱讀以下c 回答問題 cpp view plain copy using system using system.collections.generic using system.text namespace findthenumber fo...