阶乘之乘

题目背景
不告诉你……
题目描述
求出1!*2!*3!*4!*……*n!的末尾有几个零
输入输出格式
输入格式:
n(n<=10^8)
输出格式:
有几个零
输入输出
输入样例#110
输出样例#17
题面

我的做法:

将1-n 的阶乘 对2和5进行质因数分解

假设有A个5,B个2

那么最终答案为min(A,B)

原理:2*5=10

得分:80

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdio>
 6 #include<cmath> 
 7 #define ll long long
 8 #define DB double
 9 using namespace std;
10 inline int read()
11 {
12     int x=0,w=1;char ch=getchar();
13     while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
14     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
15     return x*w;
16 }
17 int n,tmp;
18 int A,B;
19 int main()
20 {
21     n=read();
22     for(int i=1;i<=n;++i)
23     {
24         tmp=i;while(tmp/5) A+=tmp/5,tmp/=5;
25         tmp=i;while(tmp/2) B+=tmp/2,tmp/=2;
26     }
27     printf("%d",min(A,B));
28     return 0;
29 }
代码

优化:

由分析可知,A一定小于等于B

所以直接统计A就可以了

所以在统计的时候i+=5 

eg, 5!与6!,7!,8!,9!中5的个数是一样的

注意一下边界

还要开long long

 

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdio>
 6 #include<cmath> 
 7 #define ll long long
 8 #define DB double
 9 using namespace std;
10 inline ll read()
11 {
12     ll x=0,w=1;char ch=getchar();
13     while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
14     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
15     return x*w;
16 }
17 ll n,tmp,A,i,k,fg;
18 int main()
19 {
20     n=read();
21     for(i=0;i<=n;i+=5)
22     {
23         tmp=i;k=0;
24         while(tmp/5) k+=tmp/5,tmp/=5;
25         A+=min(n-i+1,(ll)5)*k;
26     }
27     printf("%lld",A);
28     return 0;
29 }
代码

 

posted @ 2018-05-09 17:12  月亮茶  阅读(533)  评论(0编辑  收藏  举报