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

计算阶乘是一个经典的编程题目,可以更好地理解和掌握在C语言中计算阶乘的多种实现方式。使用C语言实现阶乘计算的五种不同方法:迭代、递归、尾递归、动态规划和使用函数指针。

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

推荐阅读
cjavapy编程之路首页