微生物增值
问题描述
假设有两种微生物 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 |
可以看出
- 每隔3秒,x加倍一次
- 当秒数是奇数时,对于y,y=y-x;
- 当秒数是偶数时,对于y,y=(y-x)*2;
要注意的是,必须分清x,y增值以及x吃y的先后顺序;
首先要进行x吃y的判定,之后才能进行增值,如果先进行增值的话,就会发生错误!
而在第0.5秒,由于原来给的10个x不是新生,所以这0.5秒x不会吃y
代码
#include <stdio.h>
#include <stdlib.h>
double x;
double y;
int n;
int add(int m)
{
//用户输入时间n以及xy初始值
scanf("%d%lf%lf",&n,&x,&y);
m = 1;
while (m <= n)
{
if (m % 2 != 0)//奇
y -= x;
if (m % 2 == 0) //偶
y = (y - x) * 2;
if (m % 3 == 0)//分裂
x *= 2;
m ++;
}
return y;
}
int main()
{
y = add(n);
printf("%.01f\n",y);
system("pause");//任意键继续 便观察
return 0;
}
总结
-
system(“pause”);任意键继续 便观察
-
找清楚规律形成逻辑再进行编译