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; }