top1编程
← 返回题目
题解

细胞分裂(仅供课堂练习使用)

1 条题解

  • 0
    @ 2026-8-4 1:58:27

    解题思路

    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