[NOIP 1998 普及组] 阶乘之和

GitHub跳转原题关系图返回列表

用 Python 大整数逐步维护当前阶乘,并累加得到 1! 到 n! 的和。

OJ: luogu

题目 ID: P1009

难度:普及-

标签:python入门循环高精度数学

日期: 2026-07-15 18:22

题意

输入 n,计算:

1!+2!+3!++n! 1!+2!+3!+\cdots+n!

其中 n <= 50,结果可能超过普通 64 位整数范围。

思路

Python 的 int 是任意精度整数,所以不需要手写高精度数组。可以一边维护当前阶乘,一边累加答案:

python
factorial *= x
answer += factorial

x1n 递增时,factorial 依次变成 1!, 2!, 3!, ...

旧目录中只有空 C++ 模板;本篇补成 Python 教学,重点是 Python 大整数和递推式循环。brute.py 不单独写,因为递推累加就是完整解法。

Python 知识

  • Python int 不会像 C++ long long 那样固定 64 位溢出。
  • range(1, n + 1) 产生 1..n
  • factorial *= x 可以从上一个阶乘得到当前阶乘,避免每次从头乘。
  • answer += factorial 累加阶乘和。

对应的本地 Python 笔记:

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/math_tools.md:Python 任意精度整数。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:整数输入输出。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/generator_expression.md:循环与聚合思想。

代码

python
n = int(input())

factorial = 1
answer = 0

for x in range(1, n + 1):
    factorial *= x
    answer += factorial

print(answer, end="")

Pythonic 写法

累乘阶乘和:

python
n = int(input())
total = fact = 1
for i in range(2, n + 1):
    fact *= i
    total += fact
print(total)

复杂度

循环 n 次。由于整数会变大,单次乘法和加法的实际成本随位数增长;在本题 n <= 50 下完全足够。

总结

Python 很适合用来学习这类高精度入门题。先利用语言自带的大整数把递推关系写清楚,再理解手写高精度会更容易。