簡體   English   中英

無法弄清楚在給定情況下如何在輸出中編程

[英]Can't figure out how to program in outputs for the given situations

因此,我正在為我的計算機科學入門課程做作業。 分配如下。

有一個生物,其種群可以根據以下規則確定:

該生物需要至少一種其他生物進行繁殖。 因此,如果種群數量達到1,則該生物將在一個時間周期內(例如一個繁殖季節)滅絕。 在不同尋常的事件中,數量均勻的生物不是一件好事。 這些生物將成對形成,並且每對中只有一個生物可以生存。如果存在奇數個生物並且該數目大於1(例如3、5、7、9等),那么這對種群有利生長。 這些生物無法配對,並且在一個時間周期內,每個生物都會產生另外兩個生物。 另外,將產生另一種生物。 (例如,假設有3個生物。由於3個是大於1的奇數,因此在一個時間周期內,這3個生物中的每一個都會產生另外2個生物。這又產生了6個生物。此外,還有一個生物產生的生物,因此總共將是10個生物,3個原始生物,3個產生的6種生物,然后再增加1個。)

答:編寫一個程序來測試從1到100,000的初始人口。 找到所有最終不會滅絕的種群。

在這里寫下您的答案:

B:找到最終滅絕的初始種群的值,但是在此之前具有最大數量的時間周期。

在這里寫下您的答案:

到目前為止,我的總體想法是(缺少Sytanx),其中P代表總體

int generations = 0;

{

如果(P是奇數)//我將使用一個模數修飾符除以2,如果結果不為0,那么我會知道它是奇數

P = 3P + 1

其他

P = 1/2 P

世代=世代+ 1

}

對我來說,問題是我不確定如何確定哪些數字不會滅絕,或者如何確定哪些人口需要最長時間滅絕。 任何的意見都將會有幫助。

基本上,您要做的是:將代碼包裝到while循環中,如果P == 1或generations> someMaxValue退出,則退出。

將此構造包裝為一個從1到100,000的for循環,並使用此計數設置初始P。

如果您總是將幾代存儲在while循環之后(例如,存儲到數組中),則可以搜索數組中最大的元素。

實際上,這個問題可能比乍一看要難。 首先,您應該使用記憶來加快速度-例如,使用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,無符號long long)來計算總體增長,與32位unsignet int一樣,已經存在1-100,000的溢出(人口的中間部分確實可以增長很多)-盡管這並沒有改變結果,但這是我最初的解決方案中的問題。 使用64位整數,我能夠在相對不錯的時間內計算出多達1億個內容(嘗試不多;優化版本的MSVC構建),因為我不得不將備忘錄表限制為前80,000,000個項目,以免耗盡內存(使用LARGEADDRESSAWARE在32位中編譯,以便能夠使用多達4 GB的內存-在64位編譯時,該表當然可以更大)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM