徐老师的阶乘计算器

【题目来源】

瑞学堂:徐老师的阶乘计算器

【题目描述】

徐老师发现很多数学问题都需要重复计算阶乘。为了简化代码和提高效率,他决定编写一个函数 factorial(n) 来计算一个非负整数 \(n\) 的阶乘。

阶乘的定义是:\(n!=1×2×3×...×n\),特别地,\(0!=1\)

现在,请你帮助徐老师完成这个任务。你需要编写一个程序,该程序包含一个名为 factorial 的函数,用于计算阶乘。主程序将读取一个整数 \(T\),表示有 \(T\) 组测试数据。对于每组数据,读取一个整数 \(n\),然后调用 factorial 函数计算 \(n!\) 并输出结果。

【输入】

第一行包含一个整数 \(T (1≤T≤10)\),表示测试数据的组数。
接下来 \(T\) 行,每行包含一个整数 \(n (0≤n≤10)\)

【输出】

输出共 \(T\) 行,每行一个整数,表示对应 \(n\) 的阶乘 \(n!\)

【输入样例】

3
5
0
10

【输出样例】

120
1
3628800

【核心思想】

  1. 问题分析:给定 \(T\) 组测试数据,每组给定一个非负整数 \(n\)\(0 \leq n \leq 10\)),要求计算 \(n! = 1 \times 2 \times \dots \times n\)(特别地,\(0! = 1\))。这是一个直接模拟乘法过程的问题,关键在于正确实现阶乘的累乘逻辑并处理边界情况 \(n=0\)\(n=1\)

  2. 算法选择

    • 直接模拟(Brute-force Simulation):从 \(2\)\(n\) 依次累乘,利用乘法的结合律直接计算结果
    • 边界处理\(0! = 1\)\(1! = 1\) 通过循环条件 i <= x 自然覆盖(循环不执行时返回初始值 \(1\)
  3. 关键步骤

    • 初始化:读取 \(T\)(测试组数),定义函数 factorial(x)
    • 函数内部
      • 初始化结果变量 res = 1(乘法单位元,确保 \(0!\)\(1!\) 正确返回 \(1\)
      • 遍历 \(i\)\(2\)\(x\)res = res \times i
      • 返回 res
    • 主程序循环
      • 读入 \(n\)
      • 调用 factorial(n) 并输出结果
    • 重复 \(T\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(T \cdot n)\),每组数据最多进行 \(n\) 次乘法(\(n \leq 10\)
    • 空间复杂度:\(O(1)\),仅使用常数个变量存储结果
  5. 模拟算法的核心思想

    • 按定义直接实现:阶乘的数学定义本身就是累乘过程,直接翻译为代码即可
    • 乘法单位元的妙用:初始化 res = 1 同时满足 \(0! = 1\) 和作为累乘起点
    • 循环起点的优化:从 \(i=2\) 开始(\(1\) 乘以任何数不变),减少一次无意义运算
    • 数据类型预防:使用 long long 防止更大范围阶乘溢出,体现工程习惯
    • 适用于计算过程明确、无复杂递推关系、数据范围极小的场景

【算法标签】

模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;
#define int long long    // 将int定义为long long,避免阶乘结果溢出(10! = 3628800,虽然int能存,但养成好习惯)
int t, n;                // t为测试数据组数,n为每组数据要计算阶乘的整数

// factorial函数:计算非负整数x的阶乘
// 注意:原代码存在bug,循环变量应使用参数x而非全局变量n
int factorial(int x)
{
    int res = 1;         // res存储阶乘结果,初始化为1(0! = 1,乘法单位元)
    for (int i = 2; i <= x; i++)  // 从2乘到x(若x为0或1,循环不执行,直接返回1)
        res *= i;        // 累乘:res = res * i
    return res;          // 返回x的阶乘结果
}

signed main()            // 使用signed main配合#define int long long
{
    cin >> t;            // 读入测试数据组数T
    while (t--)          // 依次处理每组测试数据
    {
        cin >> n;        // 读入非负整数n
        cout << factorial(n) << endl;  // 调用factorial函数计算n!并输出
    }
    return 0;
}

【运行结果】

3
5
120
0
1
10
3628800
posted @ 2026-08-06 08:44  团爸讲算法  阅读(8)  评论(0)    收藏  举报