C语言阶乘函数如何实现?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

在C语言中,计算阶乘(Factorial)是一个经典的编程练习,阶乘的定义是:一个正整数 n 的阶乘(记作 n!)是所有小于等于 n 的正整数的乘积,特别地,0! = 1

c语言factorial阶乘
(图片来源网络,侵删)

以下是几种在C语言中实现阶乘计算的方法:


方法1:使用循环(迭代法)

这是最直接和高效的方法,适用于较大的 n(但要注意整数溢出问题)。

#include <stdio.h>
unsigned long long factorial(int n) {
    if (n < 0) {
        return 0; // 阶乘未定义负数
    }
    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(num));
    }
    return 0;
}

说明:

  • 使用 unsigned long long 类型可以存储更大的阶乘值(最大支持 20!,因为 21! 会溢出)。
  • 循环从 1 乘到 n,逐步累积结果。

方法2:递归法

递归更符合数学定义,但效率较低且可能栈溢出(对于非常大的 n)。

c语言factorial阶乘
(图片来源网络,侵删)
#include <stdio.h>
unsigned long long factorial(int n) {
    if (n < 0) {
        return 0; // 阶乘未定义负数
    }
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorial(n - 1);
}
int main() {
    int num;
    printf("输入一个非负整数: ");
    scanf("%d", &num);
    if (num < 0) {
        printf("错误:阶乘未定义负数,\n");
    } else {
        printf("%d! = %llu\n", num, factorial(num));
    }
    return 0;
}

说明:

  • 递归的基准条件是 n == 0n == 1,此时返回 1
  • 递归调用 factorial(n - 1) 直到满足基准条件。

方法3:使用数组处理大数阶乘(避免溢出)

如果需要计算超过 20! 的大数阶乘(如 100!),可以使用数组模拟乘法。

#include <stdio.h>
#define MAX 1000 // 数组最大长度
void multiply(int result[], int *len, int num) {
    int carry = 0;
    for (int i = 0; i < *len; i++) {
        int product = result[i] * num + carry;
        result[i] = product % 10;
        carry = product / 10;
    }
    while (carry) {
        result[*len] = carry % 10;
        carry /= 10;
        (*len)++;
    }
}
void factorial(int n) {
    int result[MAX] = {0};
    result[0] = 1;
    int len = 1;
    for (int i = 2; i <= n; i++) {
        multiply(result, &len, i);
    }
    printf("%d! = ", n);
    for (int i = len - 1; i >= 0; i--) {
        printf("%d", result[i]);
    }
    printf("\n");
}
int main() {
    int num;
    printf("输入一个非负整数: ");
    scanf("%d", &num);
    if (num < 0) {
        printf("错误:阶乘未定义负数,\n");
    } else {
        factorial(num);
    }
    return 0;
}

说明:

  • 用数组 result 存储阶乘的每一位(逆序存储,便于计算)。
  • multiply 函数模拟手工乘法,处理进位。
  • 最终逆序输出数组即可得到正确结果。

注意事项:

  1. 数据类型范围

    c语言factorial阶乘
    (图片来源网络,侵删)
    • int:最大支持 12!479001600)。
    • unsigned long long:最大支持 20!2432902008176640000)。
    • 更大的阶乘需用数组或大数库(如 GMP)。
  2. 输入验证

    • 确保输入 n 是非负整数。
  3. 性能

    • 循环比递归更高效,递归可能因栈溢出失败(如 n > 10000)。

选择合适的方法取决于你的具体需求(如 n 的大小和性能要求)。

-- 展开阅读全文 --
头像
C语言中table begin是什么用法?
« 上一篇 今天
C语言struct time如何定义和使用?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]