题目描述
求出1!*2!*3!*4!*……*n!的末尾有几个零
输入格式
n(n<=10^8)
输出格式
有几个零
样例输入
10
样例输出
7
思路
这题相对来说很简单,但是看到数据范围我蒙圈了,10^8,要在这个范围内阶乘,10^4估计已经撑不住了,所以我们要增加很多优化,第一个优化就是在处理阶乘时的优化,我们可以把复杂度为O(n^2)的二重循环改为复杂度为O(n)的复杂度。
优化前
for(int i=1;i<=n;i++) { int t=1; for(int j=1;j<=i;j++) { t*=i; } ans*=t; }
优化后
for(int i=1;i<=n;i++) { t*=i; ans*=t; }
接着就是如何找到数字末尾有几个零,我们可以利用while循环来找。
具体如下
while(ans%10==0){ cnt++; ans/=10; }
最后输出就行了
上代码你以为就完了你就错了
因为while循环中过大会爆,所以我们可以求2和5的个数(把10分为2和5),这样程序就优化的差不多了,看看下面。(可以优化,不需要2了,代码为最终优化结果)
while(t%5==0) { sum5++; t/=5; } ans5+=sum5;
现在没问题了,上代码
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,cnt,sum5=0,ans5=0;
cin >>n;
for(int i=1;i<=n;i++){
int t=i;
while(t%5==0)
{
sum5++;
t/=5;
}
ans5+=sum5;
}
cout <<ans5;
return 0;
}