1、迭代法
这是最常见和直接的方法,通过一个for
循环来计算阶乘。
#include <stdio.h>
// 计算阶乘的迭代函数
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 num;
printf("输出不为的整数: ");
scanf("%d", &num);
if (num < 0) {
printf("负数没有阶乘的定义。\n");
} else {
printf("%d 阶乘为 %llu\n", num, factorial_iterative(num));
}
return 0;
}
2、递归法
使用递归函数来计算阶乘。
#include <stdio.h>
// 计算阶乘的递归函数
unsigned long long factorial_recursive(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial_recursive(n - 1);
}
}
int main() {
int num;
printf("输入不为零的整数: ");
scanf("%d", &num);
if (num < 0) {
printf("负数没有阶乘的定义。\n");
} else {
printf("%d 阶乘为 %llu\n", num, factorial_recursive(num));
}
return 0;
}
3、尾递归法
使用尾递归优化计算阶乘。
#include <stdio.h>
// 尾递归辅助函数
unsigned long long factorial_tail_recursive_helper(int n, unsigned long long accumulator) {
if (n == 0) {
return accumulator;
} else {
return factorial_tail_recursive_helper(n - 1, n * accumulator);
}
}
// 尾递归函数
unsigned long long factorial_tail_recursive(int n) {
return factorial_tail_recursive_helper(n, 1);
}
int main() {
int num;
printf("输入不为零的整数: ");
scanf("%d", &num);
if (num < 0) {
printf("负数没有阶乘的定义。\n");
} else {
printf("%d 阶乘为 %llu\n", num, factorial_tail_recursive(num));
}
return 0;
}
4、动态规划法
使用动态规划来计算阶乘,存储中间结果以避免重复计算。
#include <stdio.h>
// 计算阶乘的动态规划函数
unsigned long long factorial_dynamic(int n) {
unsigned long long dp[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
dp[i] = i * dp[i - 1];
}
return dp[n];
}
int main() {
int num;
printf("输入不为零的整数: ");
scanf("%d", &num);
if (num < 0) {
printf("负数没有阶乘的定义。\n");
} else {
printf("%d 阶乘为 %llu\n", num, factorial_dynamic(num));
}
return 0;
}
5、使用函数指针
使用函数指针来计算阶乘,可以在运行时动态选择计算方法。
#include <stdio.h>
// 计算阶乘的迭代函数
unsigned long long factorial_iterative(int n) {
unsigned long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 计算阶乘的递归函数
unsigned long long factorial_recursive(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial_recursive(n - 1);
}
}
// 计算阶乘的函数指针
unsigned long long (*factorial_func)(int);
int main() {
int num;
char method;
printf("输入不为零的整数:");
scanf("%d", &num);
printf("选择方法 — 迭代(i)或递归(r): ");
scanf(" %c", &method);
if (num < 0) {
printf("负数没有阶乘的定义。\n");
return 1;
}
if (method == 'i') {
factorial_func = factorial_iterative;
} else if (method == 'r') {
factorial_func = factorial_recursive;
} else {
printf("无效的方法选择。\n");
return 1;
}
printf("%d 阶乘为 %llu\n", num, factorial_func(num));
return 0;
}