题解
累乘问题
1 条题解
-
0
解题思路
题目要求从 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