毒瘤数学题:求双阶乘尾部零的个数 - C++ 代码解析
毒瘤数学题:求双阶乘尾部零的个数 - C++ 代码解析
题目描述
给定一个正整数 n,求 1!! * 2!! * 3!! *···*n!! 的结果的尾部零的个数。
双阶乘定义如下:
- (2k+1)!! = (2k+1) * (2k-1) * (2k-3) * ··· *1
- (2k)!! =(2k) * (2k-2) * (2k-4) * (2k-6) *··· * 2
输入格式
一个正整数 n 。
输出格式
一个整数,表示答案。
答案可能很大,可使用 __int128。
样例
样例输入
11
样例输出
5
样例解释:1!!*2!!3!!···*11!! = 52563198423859200000
提示
数据范围
- 对于 10% 的数据,n <= 10。
- 对于 50% 的数据,n <= 10^6。
- 对于 100% 的数据,1 <=n<= 10^18。
C++ 代码
#include <iostream>
using namespace std;
int countZeroes(int n) {
int count = 0;
while (n % 5 == 0) {
count++;
n /= 5;
}
return count;
}
int main() {
int n;
cin >> n;
int count = 0;
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
count += countZeroes(i);
}
}
cout << count << endl;
return 0;
}
代码解析
- countZeroes(int n) 函数用于计算一个数 n 的尾部零的个数。
- 循环遍历 1 到 n 的所有数字,并判断当前数字是否为偶数。如果是偶数,则调用 countZeroes 函数计算该数字的尾部零的个数,并将结果累加到 count 变量中。
- 最后输出 count 变量的值,即为 1!! * 2!! * 3!! *···*n!! 的结果的尾部零的个数。
总结
本题是一道考验数学思维和代码实现能力的毒瘤数学题。通过本题,我们可以学习如何分析问题、抽象问题、并用代码解决问题。
原文地址: https://www.cveoy.top/t/topic/quZm 著作权归作者所有。请勿转载和采集!