top1编程
← 返回题目
题解

累乘问题

1 条题解

  • 0
    @ 2026-8-4 21:06:23

    解题思路

    题目要求从 1 开始连乘:1×2×3×4×……,当乘积第一次大于等于 s 时停止,输出一共乘了几个数。

    我们用三个变量配合 while 循环:

    • s:目标值;
    • mul:当前的乘积,初始为 1;
    • cnt:已经乘了几个数,初始为 0。

    循环每执行一次,就表示"新乘了一个数":先把 cnt 加 1(记录乘了第 cnt 个数),再把 mul 乘上 cnt,然后判断 mul 是不是已经 >= s。如果达到了目标,就用 break 跳出循环。

    注意顺序:一定要先乘再看结果,而且判断用的是"第一次达到",也就是乘完当前这个数后立刻检查,满足就退出,这样 cnt 恰好是"乘到第几个数时达到目标"。

    验证样例:1×2×3×4×5×6×7×8=40320,第一次 >=20000,此时乘了 8 个数,输出 8,和样例一致。

    数据范围:s≤10000000,而 1×2×…×11≈39916800 已经超过 10000000,所以循环最多 11 次,乘积不会超过 int 的范围。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int s;              // s:累乘要达到的目标值
        cin >> s;           // 读入目标 s
        int mul = 1;        // mul:当前累乘的乘积
        int cnt = 0;        // cnt:已经乘了几个数
        while (true) {      // 无限循环,满足条件后用 break 退出
            cnt = cnt + 1;  // 先记上要乘这个数
            mul = mul * cnt;    // 乘上当前的数 cnt
            if (mul >= s) { // 乘积第一次达到目标 s
                break;      // 立刻退出循环
            }
        }
        cout << cnt << endl; // 输出乘了几个数
        return 0;
    }
    

    复杂度分析

    因为阶乘增长非常快,即使 s 取到最大值 10000000,也只需要乘到约第 11 个数就能达到目标,循环次数固定不超过 11 次,所以时间复杂度可以看作 O(1)。空间上只用 s、mul、cnt 三个变量,空间复杂度 O(1)。

    • 1