设计一个算法时间复杂度为O(n),求1!+2!+…+n!,写出写代码所需要的算法思想
时间: 2024-09-13 10:02:50 浏览: 48
要设计一个时间复杂度为O(n)的算法来求解1! + 2! + ... + n!,我们不需要完全计算每一个阶乘后再相加。由于阶乘增长速度非常快,直接逐个相加会非常慢。这里我们可以利用数学性质,即对于较大的n值,n!通常是n乘以(n-1)!的倍数。因此,我们只需要维护当前阶乘的结果,并不断更新即可,而无需保存所有阶乘。
算法思想(非递归动态规划):
1. 初始化两个变量,一个是当前阶乘值currentFact(初始化为1,表示1!),另一个是阶乘和result(初始化为0)。
2. 遍历1到n:
- 累加currentFact到result中。
- 更新currentFact为currentFact乘以当前数字n(currentFact *= n)。
3. 返回result,这就是1! + 2! + ... + n!
下面是对应的C++代码实现:
```cpp
#include <iostream>
long long sumOfFactorials(int n) {
long long currentFact = 1, result = 0;
for (int i = 1; i <= n; ++i) {
result += currentFact;
currentFact *= i;
}
return result;
}
int main() {
int n;
std::cout << "Enter a positive integer: ";
std::cin >> n;
std::cout << "The sum of factorials from 1 to " << n << " is: " << sumOfFactorials(n) << std::endl;
return 0;
}
```
阅读全文