14.关于n的阶乘的问题重难点剖析

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;
}

发布了26 篇原创文章 · 获赞 26 · 访问量 3601

猜你喜欢

转载自blog.csdn.net/xg987599519/article/details/104069220