2016-02-17 59 views
2

所以,我正在爲我的計算機科學課程介紹一項任務。分配如下。無法弄清楚如何在給定情況下對輸出進行編程

有一個有機體的人口可根據 以下原則確定:

有機體需要至少一個其他生物體進行傳播。因此,如果羣體達到1,那麼該生物將在一個時間週期(例如一個繁殖季節)中滅絕。在一個不尋常的事件中,偶數的生物體並不是一件好事。生物體將形成配對,並且從每一對中只有一個生物體能夠存活如果存在奇數個生物體並且這個數目大於1(例如,3,5,7,9,...),則這是有利於人口增長的 。生物體不能配對並且在一個時間週期內,每個生物體將產生2個其他生物體。另外,另一個 有機體將被創建。 (舉例來說,假設有3 生物體,因爲3是大於1的奇數,在一次 循環中,3個生物體中的每一個都會生成另外2個生物體,這就產生了另外的生物體。是一個更生物體 產生這樣的總將10個有機體,3張原稿逐 3產生6,然後1更多)

A:編寫測試初始種羣從1到100000的程序。 找到所有最終不會滅絕的種羣。

寫你的答案在這裏:

B:找出初始羣體,並最終進入 滅絕的價值,但有時間週期的最大數它了。

在這裏寫下你的答案:

什麼我迄今爲止的(缺乏sytanx)總的想法是這其中P代表人口

INT代= 0;

{

如果(P爲奇數)//我將使用一個模量改性劑除以2,並且如果結果不爲0然後我將知道它的奇

P = 3P + 1

別的

P = 1/2 P

幾代幾代= + 1

}

,我的問題是,我不確定如何告訴什麼號碼也不會滅絕或如何找出哪些人羣需要的時間最長去滅絕。任何的意見都將會有幫助。

+0

整齊的作業。因此,我可以給你的一點建議是,你通常想從「自上而下」工作。您擁有的第一個(或最高級別)問題是通過「1至100,000」人羣循環。這聽起來像一個while循環。然後你必須處理這個循環中的「循環」,這將是第二個循環和第一個內部循環。在一個週期中,您必須確定前一個週期中創建的總體中產生的人口。一旦完成一個循環,您將要檢查人口是否大於1,如果不是則返回。 – MattSizzle

+1

測試初始種羣價值最終不會絕跡,需要在種羣數量達到0之前進行世代交替 - 但如果它最終沒有滅絕,那麼您將永遠持續運行世代。這是暫停問題的定義:證明該方案是否會結束或沒有花費無限的時間來完成必要的inginite世代。 –

+0

僅供參考,這實際上是Collat​​z猜想,目前仍未經證實的數學猜想,認爲該系列對每個數字都是有限的。 – dascandy

回答

0

基本上你想要做的是:把你的代碼包裝成一個while循環,如果P == 1或generation> someMaxValue,則退出。

包裝這個構建成一個for循環,從1數到10萬使用此數來設定初始P.

如果你總是存儲您的while循環後的一代(如到一個數組)你然後可以搜索數組中最大的元素。

+0

爲了獲得最大數量的實際不需要全部存儲的世代,只需存儲當前最大值並檢查新計算的值是否大於最大值(然後更新最大值並存儲該最大值的總體編號)。 – axalis

+0

這是如何完成的? –

+0

您最初將最大值設置爲0(例如'size_t max_n = 0,max_gen = 0;'),那麼在您通過'for(size_t n = 1; n <= 100000; ++ n)'時,每個人口的世代數'n'。然後,'if(gen> max_gen){max_gen = gen; max_n = n}'。循環結束後,您可以在max_gen和max_n中獲得最大值。 – axalis

0

這個問題實際上可能比看起來第一眼難。首先,你應該使用記憶來加快速度 - 例如,3你得到3 - > 10 - > 5 - > 16 - > 8 - > 4 - > 2 - > 1 - > 0,所以你知道答案所有這些數字(請注意,2的每個權力將滅絕)。

但正如@Jerry所指出的那樣,問題在於最終不會絕跡的世代 - 很難說什麼時候實際停止。唯一的機會是總會有(重複)(檢查當前生物體數量時你已經通過的生物體的數量),那麼你可以肯定地說生物體不會滅絕。

編輯:我很快破解了一個解決方案,如果它是正確的,那麼你很幸運 - 每個人口在1-100,000之間似乎最終都會絕跡(因爲我的程序終止了,所以我實際上並不需要檢查重現)。現在不會給你解決方案,所以你可以自己嘗試並學習,但根據我的程序,最大週期數是351(並且數量接近範圍的3/4)。根據谷歌搜索Collat​​z猜想,這是一個正確的數字(他們說,350到1的人口,在那裏我增加一個額外的週期爲0),也是最初的人口數字同意。

一個附加提示:檢查整數溢出,並使用64位整數(無符號__int64,無符號長長)來計算人口增長,與32位unsignet INT,已經有在溢流範圍在1-100,000之間(人羣確實可以以中等的速度增長) - 這是我最初的解決方案中的一個問題,儘管它沒有改變結果。對於64位整數,我能夠在相對合適的時間內計算高達100,000,000(不再嘗試更多;優化版本MSVC構建),因爲我必須將備忘表限制在前80,000,000項,以避免內存不足使用LARGEADDRESSAWARE以32位編譯,以便能夠使用高達4 GB的內存 - 當編譯64位時,表格當然可以更大)。

+0

雅,我明白你的意思:)欣賞幫助! –