题目
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
以下程序实现了这一功能,请你补全空白处内容:
提示:
分析可知,Y分别会在0.5,1.5,2.5······时被吃,所以,把60分钟分成120份,则在除以2余数为1时,Y的数目减少X个
#include <iostream> using namespace std; int main() { int x = 10, y = 90; for (int i = 1; i <= 120; i++) { ________________; } cout << y << endl; }
分析
需要考虑X和Y的分裂以及X吃Y的行为。
首先,X每3分钟分裂一次,Y每2分钟分裂一次。因此,在每次循环中,我们需要检查当前的时间(以分钟为单位)是否是X或Y的分裂时间点。如果是,则对应的微生物数量翻倍。
其次,X从半分钟开始,每隔1分钟吃一个Y。因此,在每次循环中,我们还需要检查当前的时间(以分钟为单位)是否是X吃Y的时间点。如果是,则Y的数量减少X的数量。
代码
#include <iostream> using namespace std; int main() { int x = 10, y = 90; for (int i = 1; i <= 120; i++) // 循环代表从0.5分钟到60分钟的时间 { // 检查是否是X的分裂时间点 if (i % 6 == 0) { x *= 2; } // 检查是否是Y的分裂时间点 if (i % 4 == 0) { y *= 2; } // 检查是否是X吃Y的时间点 if (i % 2 == 1) { // 注意这里的i是从1开始的,所以除以2余1对应的是0.5, 1.5, 2.5...这样的时间点 y -= x; if (y < 0) y = 0; // 如果Y的数量变为负数,则将其设为0 } } cout << y << endl; } #用浮点数来表示时间,而不是将时间分成更小的单位。但在这个问题中,由于我们只需要考虑分裂和吃掉的整数时间点,所以这种简化的方法是可行的。此外,代码中添加了对y可能为负数的处理,这是为了防止在X的数量远大于Y的数量时出现负数的情况。
java代码
public static void main(String[] args) { int x = 10, y = 90; // 初始条件X=10, Y=90 for (double time = 0.5; time <= 60; time += 0.5) { // 从0.5分钟开始,每0.5分钟检查一次 // 检查是否是X的分裂时间点 if (time % 3 == 0) { x *= 2; } // 检查是否是Y的分裂时间点 if (time % 2 == 0) { y *= 2; } // 检查是否是X吃Y的时间点 if (time % 1 == 0.5) { // 注意这里的time是以分钟为单位的double值,所以直接比较 y -= x; if (y < 0) y = 0; // 如果Y的数量变为负数,则将其设为0 } } System.out.println("After 60 minutes, the number of Y is: " + y); }