题目描述
n的阶乘定义为n! = n ∗ (n − 1) ∗ (n − 2) ∗ … ∗ 1。
n的双阶乘定义为n!! = n ∗ (n − 2) ∗ (n − 4) ∗ … ∗ 2或n!! = n∗ (n − 2) ∗ (n − 4) ∗ … ∗ 1,取决于n的奇偶性。
但是阶乘的增长速度太快了,所以我们现在只想知道n!和n!!末尾的0的个数。
输入
一个正整数n, n ≤ 107
输出
两个整数, 分别为n!和n!!末尾0的个数。
样例输入
10
样例输出
2 1
提示
10! = 3628800, 10!! = 10 ∗ 8 ∗ 6 ∗ 4 ∗ 2 = 3840
解题思路 n!得时候只需要计算5得个数
n!!且n为偶数得时候计算5和10得个数
~~以为只是简单得 /5和/10吗~~
那你就错了
因为那个数特别大里面可能还有25 125 等5被数 所以我们也要把这些数累加进去
附上代码:
#include <bits/stdc++.h>
using namespace std;
long long a[200005],n,ans;
int main()
{
long long n,ans1,ans2,t1,t2,p,x1,x2;
ans1=ans2=0;
scanf("%lld",&n);
t1=t2=n;
p=x1=5;x2=10;
while(t1/x1){ //直到一个数 /5的倍数为0时结束
ans1+=t1/x1; //累加5的倍数
x1*=p; //每次*5
}
if(n%2==0) {while(t2/x2){
ans2+=t2/x2;
x2*=p;
}
}
else ans2=0; //奇数的n!!一定没有0
printf("%lld %lld",ans1,ans2);
return 0;
}