【GESP】C++二级练习 luogu-B3764, 计算阶乘
GESP二级练习,多层循环和分支嵌套练习,难度★✮☆☆☆。
luogu-B3764 计算阶乘
题目要求
题目描述
相信你已经知道阶乘的定义:
\[n! = n \times (n - 1) \times (n - 2) \times \dots 1\]现在,我们给出双阶乘的定义:
当 $n$ 为奇数时, \(n!! = n \times (n - 2) \times (n - 4) \times \dots \times 1\)
当 $n$ 为偶数时,
\[n!! = n \times (n - 2) \times (n - 4) \times \dots \times 2\]特别的,$0!! = 1$。
例如,$5!! = 5 \times 3 \times 1 = 15$,$6!! = 6 \times 4 \times 2 = 48$。
给定整数 $n$,请你求出 $2 \times \dfrac{n!}{n!!}$ 的值。
输入格式
本题单测试点内有多组测试数据。
输入的第一行是一个整数,表示数据组数 $T$。接下来依次给出每组数据的输入信息。
对每组数据,输入只有一行一个整数表示给定的 $n$。
输出格式
对每组数据,输出一行一个整数表示 $2 \times \dfrac{n!}{n!!}$ 的值。
样例输入 #1
1
2
1
2
样例输出 #1
1
2
样例输入 #2
1
2
1
3
样例输出 #2
1
4
数据规模与约定
- 对 $20\%$ 的数据,$n \leq 2$。
- 对 $60\%$ 的数据,$n \leq 9$。
- 对 $100\%$ 的数据,$0 \leq n \leq 34$,$1 \leq T \leq 35$。
提示:
$2 \times \dfrac {34!}{34!!} < 2^{64}$。
题目分析
- 为了计算 $2 \times \dfrac{n!}{n!!}$,我们首先需要输入测试用例的数量 $t$ 和每个测试用例的输入数 $n$。
- 然后,对于每个 $n$,根据 $n$的奇偶性,按照不同的规则进行计算。
- 注意到:根据定义$\dfrac{n!}{n!!}$,实际上可以进行化简。
- 对于奇数 $n$ \(\dfrac{n!}{n!!} = n \times (n - 2) \times (n - 4) \times \dots \times 2\)
- 对于偶数 $n$ \(\dfrac{n!}{n!!} = n \times (n - 1) \times (n - 3) \times \dots \times 1\) 如此,在可能保证过程中的计算结果在
unsigned long long
可表示的数据范围内。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int main() {
int t, n; // t为测试用例的数量,n为每个测试用例的输入数
cin >> t; // 输入测试用例的数量
for (int i = 0; i < t; i++) { // 遍历每个测试用例
cin >> n; // 输入当前测试用例的数
unsigned long long result = 1; // 初始化结果为1
if (n & 1) { // 如果n是奇数
for (int i = 2; i <= n; i += 2) { // 从2开始,每次增加2,直到n
result *= i; // 将当前数乘入结果
}
} else { // 如果n是偶数
for (int i = 1; i <= n; i += 2) { // 从1开始,每次增加2,直到n
result *= i; // 将当前数乘入结果
}
}
cout << result * 2 << endl; // 输出结果乘以2
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权