51nod 1003 阶乘后面0的数量

来源:互联网 发布:web数据挖掘pdf 编辑:程序博客网 时间:2024/05/19 22:02

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003
思路:看有多少个零,其实就是看阶乘中所有相乘的数中含有因子2和5的个数,而2的个数远远多于5的个数,所以记录所有数中含有因数5的个数。
这是自己写的矬代码,875ms,差点超时。

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,ox3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;const int INF = ( 2e9 ) + 2;const int maxn = 1e9+10;int main(){    int n;    scanf("%d",&n);    int ans=0;    for(int i=5,k=1;i<=n;i*=5,k++)    {        for(int j=1;j*i<=n;j++)        {            if(j%5!=0&&i*j<=n)            ans+=k;        }    }    printf("%d\n",ans);}

还有一种很好的写法:n/5 为为含有一个5的个数,n/25为含有2个5的个数。。依此类推

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,ox3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;const int INF = ( 2e9 ) + 2;const int maxn = 1e9+10;int main(){    int n;    scanf("%d",&n);    int ans=0;    while(n>=5)    {        ans+=n/5;        n/=5;    }    printf("%d\n",ans);}
原创粉丝点击