题目

从标准输入读入一个非负整数 n,计算并输出其阶乘 n!。约定 0! = 1。

输入格式:一行输入一个非负整数 n。

输出格式:输出一个整数表示 n! 的值,末尾换行。

数据范围与约定:0 ≤ n ≤ 20。

思路与算法

1. 阶乘的爆炸式增长
阶乘增长极快:12! 约 4.79×108(已接近 int 上限),20! 约为 2.43×1018(接近 64 位无符号上限)。本题必须使用 long long 保存阶乘结果。

2. 边界 0! 的定义
数学上规定 0! = 1。初始化 fact = 1,循环从 i = 2 累乘到 n,当输入为 0 或 1 时能自然得到正确结果 1。

完整程序

#include <stdio.h>

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 0) {
        return 1;
    }

    // 阶乘增长极快(20! ≈ 2.43×10^18),必须使用 64 位 long long
    // 约定 0! = 1,初始值设为 1
    long long fact = 1;
    for (int i = 2; i <= n; i++) {
        fact *= i;
    }

    printf("%lld\n", fact);
    return 0;
}

运行示例

输入:

5

输出:

120

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

递归求阶乘

程序:

#include <stdio.h>

static long long fact(int n)
{
    if (n <= 1) {
        return 1;
    }
    return n * fact(n - 1);
}

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 0) {
        return 1;
    }
    printf("%lld\n", fact(n));
    return 0;
}

输入:

5

输出:

120