推荐用 long long 迭代计算阶乘,n ≤ 20 安全;int 上限为 12,double 虽可表示大数但丢失整数精度;for 循环比递归更稳妥,起始值须为 1,结果初始化为 1ll。

直接用 long long 做迭代循环最稳妥,n ≤ 20 以内没问题;超过就得换大数方案,不是改类型就能解决的。
为什么不能只靠 int 或 double
int 在 32 位系统上最多存到 2147483647,而 13! = 6227020800 就已溢出;double 虽能表示更大数值(如 170!),但会丢失低精度位——比如 25! 用 double 算出来可能是 15511210043330985984000000,实际末尾几位全是错的。
-
int:安全上限是n = 12 -
long long:安全上限是n = 20(20! = 2432902008176640000) -
double:能“表示”很大n,但不保证整数精度,慎用于需要精确结果的场景
for 循环迭代是最推荐的入门写法
它逻辑直白、无栈风险、性能好,且容易加边界检查。别一上来就写递归,尤其当 n 可能大于 100 时。
- 起始值必须是
1,不是0(否则整个结果变 0) - 循环变量从
1到n或从2到n都行,但后者需提前处理n == 0和n == 1 - 推荐用
long long接收结果,声明时初始化为1LL更明确
long long factorial(int n) {
if (n
<h3>递归写法只适合教学或小数据</h3>
<p>它代码短,但每层调用都占栈空间。<code>n = 1000</code> 时大概要 1000 层调用,多数编译器默认栈大小扛不住,直接 <code>Segmentation fault</code>。</p>
- 必须设好终止条件:
n == 0 || n == 1返回1 - 不要写成
if (n == 1) return 1却漏掉n == 0,否则factorial(0)会错算 - GCC/Clang 默认栈约 8MB,保守估计安全递归深度不超过几百
真要算 n > 20 的阶乘,得自己模拟大整数
没有现成“开箱即用”的标准库函数。STL 不提供大整数,boost::multiprecision 是可选,但多数课程或 OJ 要求手写。
- 核心是用
vector<int></int>存各位数字,低位在前(方便进位) - 每次乘一个整数,逐位计算并处理进位,最后反转输出
- 别用字符串直接拼接再转整数——效率极低,且无法处理千位以上
- 常见坑:进位没清零、数组扩容没做、输出时高位零没跳过
真正难的不是乘法逻辑,而是边界控制和内存管理——比如 1000! 有 2568 位,vector 要预留足够空间,否则反复 push_back 影响性能。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











