你好,我是沐爸,欢迎点赞、收藏和关注。个人知乎
今日算法第3题,如何进行微生物养殖,一起看看吧。
题目
假设有两种微生物 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个
javascript
let X = 10, Y = 90;
for (let i = 1; i <= 120; i++) {
// 请将此处补充完整
}
console.log(Y);
试题图解
根据迭代和对应的时间,看看 X 和 Y 是怎么变化的。
迭代序号 | 时间(分钟) | X | Y |
---|---|---|---|
1 | 0.5 | 10 | 79=89-10 |
2 | 1 | 10 | 79 |
3 | 1.5 | 10 | 69=79-10 |
4 | 2 | 10 | 138=69*2 |
5 | 2.5 | 10 | 128=138-10 |
6 | 3 | 20=10*2 | 128 |
7 | 3.5 | 20 | 108=128-20 |
8 | 4 | 20 | 216=108*2 |
9 | 4.5 | 20 | 196=216-20 |
10 | 5 | 20 | 196 |
11 | 5.5 | 20 | 176=196 - 20 |
12 | 6 | 40=20*2 | 352=176*2 |
从上图可看出规律:
- 1,3,5,7,9,11 当为奇数时,即每隔一分钟,Y 的数量需要减去 X。
- 4,8 如果是4的倍数,即每隔2分钟,Y 的数量都会翻倍
- 6 如果是6的倍数,即每隔3分钟,X 的数量都会翻倍
- 12,是4和6的公倍数,此时X和Y的数量都会翻倍
- 其余时间,两者的数量都不变
知道了变化规律,是不是就简单了,将上面的试题补充完整,结果就是:
javascript
let X = 10, Y = 90;
for (let i = 1; i <= 120; i++) {
if (i % 2 === 1) {
Y -= X;
}
if (i % 4 === 0) {
Y *= 2;
}
if (i % 6 === 0) {
X *= 2;
}
}
console.log(Y); // 94371840
如果 Y 的初始值为89,结果是 -979369984,所以,控制不好 X 和 Y的数量,养殖的时候,Y可能早就被吃完了。
好了,分享结束,谢谢点赞,下期再见。