n!问题
给定一个数的阶乘,让你求有多少个质因子p。
常规算法
直接枚举n的阶乘的数,然后求出每一数所含有的质因子p,然后相加即可
int cal(int n,int p)//常规算法
{
int counts=0;
for(int i=2;i<=n;i++)
{
int temp=i;
while(temp%p==0)
{
counts++;
temp/=p;
}
}
return counts;
}
这种算法的复杂度较大为log(nlogn)。当n较大时,程序就无法承受了!
相关图解
以10!,质因数2为例进行推导!
实现代码
非递归实现
int cal(int n,int p)//求n!的某个质因子的个数
{
int ans=0;
while(n)
{
ans+=n/p;
n/=p;
}
return ans;
}
递归实现
int cal(int n,int p)//递归实现
{
if(p>n) return 0;
else return n/p+cal(n/p,p);
}