Skip to content Skip to footer

C语言编程题计算阶乘5种方法

1、迭代法这是最常见和直接的方法,通过一个for循环来计算阶乘。

#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 num;

printf("输出不为的整数: ");

scanf("%d", &num);

if (num < 0) {

printf("负数没有阶乘的定义。\n");

} else {

printf("%d 阶乘为 %llu\n", num, factorial_iterative(num));

}

return 0;

}2、递归法使用递归函数来计算阶乘。

#include

// 计算阶乘的递归函数

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

// 尾递归辅助函数

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

// 计算阶乘的动态规划函数

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

// 计算阶乘的迭代函数

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;

}

Copyright © 2088 世界杯八强_2018年世界杯亚洲区预选赛 - nprny.com All Rights Reserved.
友情链接