在C语言中,计算阶乘(Factorial)是一个经典的编程练习,阶乘的定义是:一个正整数 n 的阶乘(记作 n!)是所有小于等于 n 的正整数的乘积,特别地,0! = 1。

(图片来源网络,侵删)
以下是几种在C语言中实现阶乘计算的方法:
方法1:使用循环(迭代法)
这是最直接和高效的方法,适用于较大的 n(但要注意整数溢出问题)。
#include <stdio.h>
unsigned long long factorial(int n) {
if (n < 0) {
return 0; // 阶乘未定义负数
}
unsigned long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int num;
printf("输入一个非负整数: ");
scanf("%d", &num);
if (num < 0) {
printf("错误:阶乘未定义负数,\n");
} else {
printf("%d! = %llu\n", num, factorial(num));
}
return 0;
}
说明:
- 使用
unsigned long long类型可以存储更大的阶乘值(最大支持20!,因为21!会溢出)。 - 循环从
1乘到n,逐步累积结果。
方法2:递归法
递归更符合数学定义,但效率较低且可能栈溢出(对于非常大的 n)。

(图片来源网络,侵删)
#include <stdio.h>
unsigned long long factorial(int n) {
if (n < 0) {
return 0; // 阶乘未定义负数
}
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int num;
printf("输入一个非负整数: ");
scanf("%d", &num);
if (num < 0) {
printf("错误:阶乘未定义负数,\n");
} else {
printf("%d! = %llu\n", num, factorial(num));
}
return 0;
}
说明:
- 递归的基准条件是
n == 0或n == 1,此时返回1。 - 递归调用
factorial(n - 1)直到满足基准条件。
方法3:使用数组处理大数阶乘(避免溢出)
如果需要计算超过 20! 的大数阶乘(如 100!),可以使用数组模拟乘法。
#include <stdio.h>
#define MAX 1000 // 数组最大长度
void multiply(int result[], int *len, int num) {
int carry = 0;
for (int i = 0; i < *len; i++) {
int product = result[i] * num + carry;
result[i] = product % 10;
carry = product / 10;
}
while (carry) {
result[*len] = carry % 10;
carry /= 10;
(*len)++;
}
}
void factorial(int n) {
int result[MAX] = {0};
result[0] = 1;
int len = 1;
for (int i = 2; i <= n; i++) {
multiply(result, &len, i);
}
printf("%d! = ", n);
for (int i = len - 1; i >= 0; i--) {
printf("%d", result[i]);
}
printf("\n");
}
int main() {
int num;
printf("输入一个非负整数: ");
scanf("%d", &num);
if (num < 0) {
printf("错误:阶乘未定义负数,\n");
} else {
factorial(num);
}
return 0;
}
说明:
- 用数组
result存储阶乘的每一位(逆序存储,便于计算)。 multiply函数模拟手工乘法,处理进位。- 最终逆序输出数组即可得到正确结果。
注意事项:
-
数据类型范围:
(图片来源网络,侵删)int:最大支持12!(479001600)。unsigned long long:最大支持20!(2432902008176640000)。- 更大的阶乘需用数组或大数库(如 GMP)。
-
输入验证:
- 确保输入
n是非负整数。
- 确保输入
-
性能:
- 循环比递归更高效,递归可能因栈溢出失败(如
n > 10000)。
- 循环比递归更高效,递归可能因栈溢出失败(如
选择合适的方法取决于你的具体需求(如 n 的大小和性能要求)。
