2 20 程式理解和時間分析

2021-07-10 17:01:36 字數 2190 閱讀 2971

c++**如下:

#include #include #include using namespace std;

int main(void)

int hit = 0, hit1 = -1, hit2 = -1;

for (__int64 i = 1; i < int64_max; ++i)

// if

else if (hit == 2)

//else if

else

// else

}//end if

}// end for

// ! 注意這裡if語句的位置

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

//end if

}// end for

return 0;

}

問題1:

這個程式要找的是符合什麼條件的數?

問題2:這樣的數存在麼?符合這一條件的最小的數是什麼?

問題3:

在電腦上執行這一程式,你估計要多長時間才能輸出第乙個結果?時間精確到分鐘(電腦配置:單核cpu2.0ghz,記憶體和硬碟資源充足)

---------------------------分割線 個人一些想法----------------------------

注意一下if語句的位置,剛開始看題時以為if語句在內層for迴圈裡面,結果就理解錯了,錯了,了~

仔細分析一下,程式的目的是找出乙個數,這個數滿足以下性質:

不能被rg陣列內的某兩個連續數整除,但是能被陣列內的其他數整除。

[假設rg陣列的元素個數為n 這裡 n = 30]

即等價為:<=>

找乙個num     滿足 num % rg[i] == 0 && num % rg[i + 1] == 0 && num % rg[j] != 0 【0≤i

碰到這種取餘的運算,條件反射想到 最小公倍數 最大公約數等等。

恩 但這道題沒有那麼容易。

首先num僅且只能不被兩個rg陣列內的數整除。 (rg陣列內數的範圍是2~31)

假設不能被整除的第乙個數為rg[i] 第二個即為rg[i + 1]

很顯然 15是乙個分界線  比如 30 = 2 * 15 那麼rg[i] ≤ 15 很明顯不行 至少不能被三個數整除。。(想想看 是不是這樣)

接下來考慮的就是陣列內元素之間的因子轉換了  【記得找 大於15的數】

16 = 2 * 8

18 = 2 * 9

20  = 4 * 5

21 = 3 * 7

22 = 2 * 11

24 = 3 * 8

30 = 2 * 15

分析一下:

上面列出的一些因子乘式中  兩個因子看似沒有很大關係 似乎找不到要找的數。

如果num能整除兩個因子 那麼必然num肯定能整除它們的乘積(再次想想看 是不是這樣)

因此 這樣好像就是找不到了。。找不到。。找不到?!

-------------到底錯在哪----------------

好吧 其實我們沒有考慮兩個因子之間的關係 什麼關係呢~

----------萬一兩個因子之間是可以整除的!!!---------

上面滿足這一條件的是 16 = 2 * 8   其中因子2可以整除因子8。  

因此  rg[i] = 16  rg[i + 1] = 17

問題轉化為 : 找不能被16和17整除 但能被其他數整數整除的數。

接下來找最小的那個。。

任何乙個非素數都可以寫成 2^k1 * 3^k2 * 5^k3的形式。(k1 k2 k3 ≥ 0)

要想整除16和17外所有的數  這個數至少滿足:

整除8 

整除27

整除25

整除其餘的素數(除 2 3 5 17外)

即:2^3 * 3^3 * 5^2 * 7 * 11 * 13 * 19 * 23 * 29 * 31 ===>2123581660200

參考網路上答案的解釋~感謝

【程式設計之美】2.20程式理解和時間分析 -- 匡子語

再次感嘆

數學之美~

程式設計之美~

程式設計之美 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...