51Nod 1003 阶乘后面0的数量

来源:互联网 发布:淘宝店如何退货 编辑:程序博客网 时间:2024/06/06 00:52

题目链接


这题第一想到的就是大数,根据前面学的知识,压位相乘,然后求0的个数就行

超时:

#include<iostream>#include<cstdio>#include<math.h>#include<cstring>#include<algorithm>#include<queue>#include<set>#include<vector>using namespace std;const long long mod=100000000;int main(){int n;cin>>n;static long long a[10000000]={0};a[0]=1;int len=1;for(int i=2;i<=n;i++){long long r=0;for(int j=0;j<len;j++){long long fz=a[j]*i+r;a[j]=fz%mod;r=fz/mod;}if(r!=0) a[len++]=r;}int sum=0;for(int i=0;i<len;i++){long long num=a[i];if(num==0) sum+=8;elsewhile(num){int fz=num%10;num/=10;if(fz==0) sum++;else{cout<<sum<<endl;return 0;}}} return 0;}

然后看了相关讨论,里面讲到只有2和5遇到才会产生0(或者2的倍数和5的倍数)

然是2的个数比5的多,所以只需要计算n中包含多少个5就行

例如100

100/5=20.。20/5=4.。4/5=0 所以100!有24个0

不就是求5的个数嘛?为什么还要无线除5呢?100/5不就是5的个数了嘛?

其实不是的,我最初就有这个疑惑。

无限的除以5是因为100/5=20.在20里面每5个数还有5的倍数,即在100里面每25个数也有一个5的倍数

例如25=5*5.如果单纯的用100/5,至少这个是少计算一次

#include<iostream>#include<cstdio>#include<math.h>#include<cstring>#include<algorithm>#include<queue>#include<set>#include<vector>using namespace std;const long long mod=1e15;int main(){int n;cin>>n;int sum=0;while(n){sum+=n/5;n/=5;}cout<<sum;return 0;}


原创粉丝点击