无法弄清楚如何针对特定情况对输出进行编程

时间:2016-02-17 21:11:56

标签: c++

所以,我正在为我的计算机科学课开设工作。作业如下。

  

有一种生物可以根据生长来确定   以下规则:

     

该生物体需要至少一种其他生物体繁殖。从而,   如果人口达到1,那么有机体就会灭绝   一个时间周期(例如一个繁殖季节)。在一个不寻常的转折   事件,偶数生物并不是一件好事。该   生物体将形成配对,每对生物体只会生成一对生物体   如果存在奇数个生物并且这个数字是   大于1(例如,3,5,7,9,...),那么这对人口有益   生长。生物体不能在一个时间周期内配对   有机体将产生2种其他生物。另外,还有一个   有机体将被创造。 (举个例子,我们说有3个   生物。由于3是一次大于1的奇数   循环,3种生物中的每一种都会产生2种其他生物。这产生6   其他生物。此外,还有一种生物   所以产生的总共将有10种生物,3种原始物,6种产生   3,然后再1。)

     

答:编写一个测试初始人口从1到100,000的程序。   找出最终没有灭绝的所有种群。

     

在这里写下你的答案:

     

B:找出最终进入的初始人口的价值   已灭绝,但在此之前具有最大的时间周期数。

     

在这里写下你的答案:

到目前为止,我所掌握的一般观点是(缺乏sytanx)是P代表人口

  

int generations = 0;

     

{

     
    

如果(P是奇数)//我将使用模数修改器除以2,如果结果不是0,那么我将知道它的奇数

         

P = 3P + 1

  
     

否则

     
    

P = 1/2 P

  
     

代=代数+ 1

     

}

对我来说,问题是我不确定如何判断哪些数字不会灭绝,或者如何确定哪个数量最长的灭绝时间。任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:0)

基本上你要做的是:将代码包装成一个while循环,如果P == 1或代数>退出someMaxValue。

将此构造包装到1到100,000之间的for循环中,并使用此计数设置初始P。

如果你总是在你的while循环之后存储几代(例如,在数组中),那么你可以搜索数组中最大的元素。

答案 1 :(得分: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,无符号长long)来计算总体增长,与32位unsignet int一样,已经有溢出在1-100,000范围内(人口确实可以在中间增长很多) - 这在我的初始解决方案中是一个问题,尽管它没有改变结果。使用64位整数,我能够在相对不错的时间内计算高达100,000,000(没有尝试更多;优化发布MSVC版本),因为我必须将备忘录表限制为前80,000,000项不会耗尽内存(使用LARGEADDRESSAWARE以32位编译,以便能够使用最多4 GB的内存 - 当编译64位时,表当然可以更大。)