题解
细胞分裂(仅供课堂练习使用)
1 条题解
-
0
解题思路
1 个细胞每次分裂都会翻倍:第 1 次分裂后变成 2 个,第 2 次变成 4 个,第 3 次变成 8 个……问第 5 次分裂完成后一共有几个细胞。
先找规律:每次翻倍,就是每次乘 2。
- 第 1 次后:2 个;
- 第 2 次后:4 个;
- 第 3 次后:8 个;
- 第 4 次后:16 个;
- 第 5 次后:32 个。
这个翻倍的过程可以写成 2^5 = 32,但写代码有两种方法:
方法一(用循环,推荐):用一个变量
s存当前细胞数,初始为 1;循环 5 次,每次执行s = s * 2;,最后s就是答案。程序跑的时候s会依次变成 2、4、8、16、32,能清楚地看到翻倍过程。方法二(直接乘):题目固定问第 5 次,直接算
2*2*2*2*2也行。但用循环更通用——如果以后问第 100 次,把循环条件里的 5 改成 100 就行,而“直接乘”就得写 100 个 2,根本不现实。要注意“边界”:为什么循环 5 次不是 4 次?因为第 1 次分裂就让细胞从 1 变成 2,一共要经历 5 次翻倍,所以循环条件写
i <= 5。循环次数多一次、少一次,答案都会错,这是最需要小心的地方。本题答案是 32,用int完全够。参考代码
#include <iostream> using namespace std; int main() { int s; // s:当前细胞个数 s = 1; // 最开始只有1个细胞 int i; // i:循环变量,表示正在进行第几次分裂 for (i = 1; i <= 5; i = i + 1) { s = s * 2; // 每分裂一次,细胞数翻倍 } cout << s << endl; // 输出第5次分裂完成后的细胞数 return 0; }复杂度分析
细胞数与次数 i 的关系是 s = 2^i,数值会指数增长。但本题固定只算 5 次,循环只执行 5 次,是常数次操作,所以时间复杂度是 O(1)。
如果把题目改成“问第 k 次”,循环就要执行 k 次,复杂度就变成 O(k)。
空间上只用了 2 个 int 变量,空间复杂度是 O(1)。
- 1