14.关于n的阶乘的问题重难点剖析
1.求n!中有多少个质因子p;
算法①: 复杂度(nlogn)
只适用于n很小的情况 [PASS]
int _sum(int n,int p)
{
int ans=0;
for(int i=2;i<=n;i++)
{
int temp=i;
while(temp%p==0) //如果有因子p +1 且除以p 直至没有因子p
{
ans++;
temp/=p;
}
}
return ans;
}
算法②:复杂度(logn)
int _sum(int n,int p)
{
int ans=0;
while(n)
{
ans+=n/p; //由数学公式推导 这里不再赘述
n/=p;
}
return ans;
}
算法②:递归写法 个人记忆法:npnpp 谐音(你怕你婆婆)
int _sum(int n,int p)
{
if(n<p) return 0;
return n/p+_sum(n/p,p);
}
2.求阶乘末尾0的个数
思路:
int _sum(int n,int p)
{
if(n<p) return 0;
return n/p+_sum(n/p,p); //就是这里的p改成5 就可以了
}
源代码:
#include <bits/stdc++.h>
using namespace std;
int _sum(int n,int p)
{
if(n<p) return 0;
return n/p+_sum(n/p,p); //个人记忆法:npnpp 谐音(你怕你婆婆)
}
int main()
{
cout<<_sum(1024,5); //如果求阶乘末尾0的个数 这里的p选择5即可
return 0;
}