题目描述:
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
由上面的规律得到程序代码:
假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
以x=10 y=90分析
一开始的10个x是刚出生的,所以它们在半分钟之后就要吃y,所以0.5分钟的时候,y的数量减少,注意:下一次吃y的时候是1分钟之后;
在1分钟的时候,x不分裂,y也不分裂,并且x并不会吃y;
在1.5分钟的时候,每个x吃掉一个y;
在2分钟的时候,x加倍,此时x并不吃掉y;
在2.5分钟的时候,每个x吃掉一个y;
在3分钟的时候,x加倍,此时x并不吃掉y;
在3.5分钟的时候,每个x吃掉一个y(此时的20个x中,10个是新生的x,因为距离出生过了0.5分钟,所以吃掉一个y;还有10个是老的x,因为距离上次吃y已经过了1分钟,所以再吃掉一个y);
在4分钟的时候,y加倍,x并不吃y;
在4.5分钟的时候,每个x吃掉一个y(因为此时的20个x都是老的x了);
在5分钟的时候,x不变,y也不变;
在5.5分钟的时候,每个x吃掉一个y;
在6分钟的时候,x加倍,y加倍,此时x并不会吃掉y;
……
通过以上,我们可以得出x和y的数量变化的规律:
x并不会死亡,数量随着时间呈指数增长;
y自身会随着时间的增加而增加,但是其数量还受到x的限制;
我们还可发现,x在时间为2的倍数的时候加倍,y在时间是3的倍数的时候加倍,而x吃掉y是在每个半分钟的时候发生的,所以当x吃y的时候,x不会加倍,y也不会加倍。
因此,可以把以上三个时间看成是相互独立的。
时间 | x的数量 | y的数量 | 备注 |
0.0 | 10 | 90 | |
0.5 | 10 | 80 | 80=90-10 |
1.0 | 10 | 80 | |
1.5 | 10 | 70 | 70=80-10 |
2.0 | 10 | 140 | 140=70*2 |
2.5 | 10 | 140 | 130=140-10 |
3.0 | 20 | 130 | |
3.5 | 20 | 110 | 110=130-20 |
4.0 | 20 | 220 | 220=110*2 |
4.5 | 20 | 200 | 200=220-20 |
5.0 | 20 | 200 | |
5.5 | 20 | 180 | 180=200-20 |
6.0 | 40 | 360 | |
6.5 | 40 | 320 | 320=360-40 |
7.0 | 40 | 320 | |
7.5 | 40 | 280 | 280=320-40 |
8.0 | 40 | 560 | 560=280*2 |
8.5 | 40 | 520 | 520=560-40 |
9.0 | 80 | 520 |
#include <iostream>
using namespace std;
int jieguo(int x,int y,int m)
{
for(int i=1;i<=m;i++)
{
if(i%2==1)
{
y-=x;
}
if(i%4==0)
{
y=y*2;
}
if(i%6==0)
{
x=x*2;
}
}
return 0;
}
int main()
{
int i;
jieguo(10,90,120);
jieguo(10,89,120);
return 0;
}