繁体   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