在C语言中,计算阶乘的方法主要有两种:递归和循环。以下是这两种方法的详细说明和示例代码:
递归方法
递归方法是通过函数自身调用自身来计算阶乘。递归的基本思想是将问题分解为更小的子问题,直到达到基本情况(n=0时,阶乘为1)。
```c
include
unsigned long long factorial_recursive(int n) {
if (n == 0) {
return 1; // 基本情况
} else {
return n * factorial_recursive(n - 1); // 递归情况
}
}
int main() {
int number;
printf("Enter a positive integer: ");
scanf("%d", &number);
if (number < 0) {
printf("Error: Negative number!\n");
return 1;
}
unsigned long long result = factorial_recursive(number);
printf("%d! = %llu\n", number, result);
return 0;
}
```
循环方法
循环方法是通过一个for循环来计算阶乘,从1开始逐个累乘,直到n。
```c
include
unsigned long long factorial_iterative(int n) {
unsigned long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int number;
printf("Enter a positive integer: ");
scanf("%d", &number);
if (number < 0) {
printf("Error: Negative number!\n");
return 1;
}
unsigned long long result = factorial_iterative(number);
printf("%d! = %llu\n", number, result);
return 0;
}
```
注意事项
数据类型选择:
阶乘的结果会很快增长,可能会超出`int`或`long`的范围,因此建议使用`unsigned long long`类型来存储结果。
输入验证:
在计算阶乘之前,应该验证输入是否为正整数,避免负数输入导致的错误。
示例
```c
include
// 递归方法
unsigned long long factorial_recursive(int n) {
if (n == 0) {
return 1; // 基本情况
} else {
return n * factorial_recursive(n - 1); // 递归情况
}
}
// 循环方法
unsigned long long factorial_iterative(int n) {
unsigned long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int method;
printf("Choose method to calculate factorial (1: Recursive, 2: Iterative): ");
scanf("%d", &method);
int number;
printf("Enter a positive integer: ");
scanf("%d", &number);
if (number < 0) {
printf("Error: Negative number!\n");
return 1;
}
unsigned long long result;
if (method == 1) {
result = factorial_recursive(number);
} else if (method == 2) {
result = factorial_iterative(number);
} else {
printf("Invalid method!\n");
return 1;
}
printf("%d! = %llu\n", number, result);
return 0;
}
```
通过上述代码,用户可以选择使用递归或循环方法来计算阶乘,并且程序会处理负数输入的情况。