本文分享的必刷题目是从蓝桥云课、洛谷、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 (1≤T≤10),表示测试数据的组数。 接下来
T
T
T 行,每行包含一个整数
n
(
0
≤
n
≤
10
)
n (0≤n≤10)
n (0≤n≤10)。
【输出】
输出共
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
0≤n≤10),要求计算
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
- 初始化结果变量 res = 1(乘法单位元,确保
- 主程序循环:
- 读入
n
n
n - 调用 factorial(n) 并输出结果
- 读入
- 重复
T
T
T 次
时间/空间复杂度:
- 时间复杂度:
O
(
T
⋅
n
)
O(T \\cdot n)
O(T⋅n),每组数据最多进行n
n
n 次乘法(n
≤
10
n \\leq 10
n≤10) - 空间复杂度:
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
网硕互联帮助中心



评论前必须登录!
注册