云计算百科
云计算领域专业知识百科平台

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

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

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

【题目描述】

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

n

n

n 的阶乘。

阶乘的定义是:

n

!

=

1

×

2

×

3

×

.

.

.

×

n

n!=1×2×3×…×n

n!=1×2×3××n,特别地,

0

!

=

1

0!=1

0!=1

现在,请你帮助徐老师完成这个任务。你需要编写一个程序,该程序包含一个名为 factorial 的函数,用于计算阶乘。主程序将读取一个整数 

T

T

T,表示有 

T

T

T 组测试数据。对于每组数据,读取一个整数 

n

n

n,然后调用 factorial 函数计算 

n

!

n!

n! 并输出结果。

【输入】

第一行包含一个整数 

T

 

(

1

T

10

)

T (1≤T≤10)

T (1T10),表示测试数据的组数。 接下来 

T

T

T 行,每行包含一个整数 

n

 

(

0

n

10

)

n (0≤n≤10)

n (0n10)

【输出】

输出共 

T

T

T 行,每行一个整数,表示对应 

n

n

n 的阶乘 

n

!

n!

n!

【输入样例】

3
5
0
10

【输出样例】

120
1
3628800

【核心思想】

  • 问题分析:给定

    T

    T

    T 组测试数据,每组给定一个非负整数

    n

    n

    n

    0

    n

    10

    0 \\leq n \\leq 10

    0n10),要求计算

    n

    !

    =

    1

    ×

    2

    ×

    ×

    n

    n! = 1 \\times 2 \\times \\dots \\times n

    n!=1×2××n(特别地,

    0

    !

    =

    1

    0! = 1

    0!=1)。这是一个直接模拟乘法过程的问题,关键在于正确实现阶乘的累乘逻辑并处理边界情况

    n

    =

    0

    n=0

    n=0

    n

    =

    1

    n=1

    n=1

  • 算法选择:

    • 直接模拟(Brute-force Simulation):从

      2

      2

      2

      n

      n

      n 依次累乘,利用乘法的结合律直接计算结果

    • 边界处理:

      0

      !

      =

      1

      0! = 1

      0!=1

      1

      !

      =

      1

      1! = 1

      1!=1 通过循环条件 i <= x 自然覆盖(循环不执行时返回初始值

      1

      1

      1

  • 关键步骤:

    • 初始化:读取

      T

      T

      T(测试组数),定义函数 factorial(x)

    • 函数内部:
      • 初始化结果变量 res = 1(乘法单位元,确保

        0

        !

        0!

        0!

        1

        !

        1!

        1! 正确返回

        1

        1

        1

      • 遍历

        i

        i

        i

        2

        2

        2

        x

        x

        x:res = res \\times i

      • 返回 res
    • 主程序循环:
      • 读入

        n

        n

        n

      • 调用 factorial(n) 并输出结果
    • 重复

      T

      T

      T

  • 时间/空间复杂度:

    • 时间复杂度:

      O

      (

      T

      n

      )

      O(T \\cdot n)

      O(Tn),每组数据最多进行

      n

      n

      n 次乘法(

      n

      10

      n \\leq 10

      n10

    • 空间复杂度:

      O

      (

      1

      )

      O(1)

      O(1),仅使用常数个变量存储结果

  • 模拟算法的核心思想:

    • 按定义直接实现:阶乘的数学定义本身就是累乘过程,直接翻译为代码即可
    • 乘法单位元的妙用:初始化 res = 1 同时满足

      0

      !

      =

      1

      0! = 1

      0!=1 和作为累乘起点

    • 循环起点的优化:从

      i

      =

      2

      i=2

      i=2 开始(

      1

      1

      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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 题解:瑞学堂 徐老师的阶乘计算器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!