2349. 魔力阶乘
1000ms
256MB
简单
循环
简单数学
题目描述
阶乘的定义:一个正整数的阶乘是所有小于及等于该数的正整数的乘积。
- 例如:3 的阶乘为 $3! = 1 \times 2 \times 3 = 6$。
- 例如:5 的阶乘为 $5! = 1 \times 2 \times 3 \times 4 \times 5 = 120$。
在魔法森林里,松鼠哈利种下了一棵“阶乘魔力果树”。这棵树第一天结出 $1!$ 个坚果,第二天结出 $2!$ 个坚果……第 $i$ 天结出 $i!$ 个坚果。
给定一个正整数 $N$(表示天数),请你计算前 $N$ 天(包含第 1 天和第 $N$ 天)哈利一共可以收获多少个坚果?
输入格式
输入一个正整数 $N$ ($3 \le N \le 20$)。
输出格式
输出 1 到 $N$ 之间(包含 1 和 $N$)所有正整数阶乘的和。
样例 1
输入 (Input)
3
输出 (Output)
9
样例说明
输入为 3。1 的阶乘为 1,2 的阶乘为 2,3 的阶乘为 6。
总和为 $1 + 2 + 6 = 9$,因此输出 9。
- 对于所有数据:$3 \le N \le 20$。
- **整型溢出提示**:
当 $N = 20$ 时,$20!$ 的大小约为 $2.43 \times 10^{18}$。这已经远远超出了 C++ 中标准整型 `int`(最大约为 $2 \times 10^9$)的表示上限。
因此,在程序中保存阶乘结果以及总和的变量,必须定义为 **`long long`** 类型(在 64 位系统中可表示的最大值约为 $9.22 \times 10^{18}$),否则计算出的结果会发生溢出错误。
- **算法提示**:
不需要每次都重新计算每个数的阶乘(这样复杂度为 $O(N^2)$)。可以使用一个变量 `current_fact` 在循环中不断乘以当前的 $i$,从而以 $O(N)$ 的时间复杂度累加得出答案。
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout
错误 stderr
操作成功