假设有两种微生物 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与y关于时间的对应关系即可。
先看一下前9分钟的情况(以10和90为例)
时间 | x | y | 原因 |
0.0 | 10 | 90 | |
0.5 | 10 | 90 | |
1.0 | 10 | 80 | 90-10 |
1.5 | 10 | 80 | |
2.0 | 10 | 140 | (80-10)*2 |
2.5 | 10 | 140 | |
3.0 | 20 | 130 | 140-10 |
3.5 | 20 | 120 | 130-10 |
4.0 | 20 | 220 | (120-10)*2 |
4.5 | 20 | 210 | 220-10 |
5.0 | 20 | 200 | 210-10 |
5.5 | 20 | 190 | 190-10 |
6.0 | 40 | 360 | (190-10)*2 |
6.5 | 40 | 340 | 360-20 |
7.0 | 40 | 320 | 340-20 |
7.5 | 40 | 300 | 320-20 |
8.0 | 40 | 560 | (300-20)*2 |
8.5 | 40 | 540 | 560-20 |
9.0 | 80 | 520 | 540-20 |
(本表格参考其他博客)
备注:第0.5秒时,由于原来给的10个x不是新生,所以这0.5秒x不会吃y
可以看出,每隔3秒,x加倍一次
当秒数是奇数时,对于y,y=y-x;
当秒数是偶数时,对于y,y=(y-x)*2;
要注意的是,必须分清x,y增值以及x吃y的先后顺序:
首先要进行x吃y的判定,之后才能进行增值,如果先进行增值的话,就会发生错误!
当x=10,y=90时,最后y的结果是:94371840
计算代码:
#include<stdio.h> #include<stdlib.h> int main() { int n,m; double x,y; scanf("%d%lf%lf",&n,&x,&y); m=1; while(m<=n) { if(m%2!=0) y=y-x; if(m%2==0) y=(y-x)*2; if(m%3==0) x*=2; //printf("m=%d x=%.0lf y=%.0lf\n",m,x,y); m++; } printf("x=%.0lf y=%.0lf\n",x,y); system("pause"); return 0; }