关于素数的算法
1.质因数的分解
一个数x能够被分解成两个素数相乘x=a*b,求较大质数。
思路:从2到根号x找出较小x的因数,用x/较小因数即可。
#include <iostream>
using namespace std;
#include <cmath>
int main()
{
int x;
cin>>x;
int t=sqrt(x);
for(int i=2;i<=t;i++)
{
if(x%i==0)
{
cout<<x/i<<endl;
break;
}
}
return 0;
}
2.较大质数
输入一个数n,求出2-n最大质数;
思路:公式
for(int i=1;i<=n;i++)
{
ans+=log10(i);
}即可
#include <iostream>
using namespace std;
#include <cmath>
int main()
{
int t,n;
double ans;
cin>>t;
while (t--){
cin>>n;
ans=0;
for(int i=1;i<=n;i++)
{
ans+=log10(i);
}
cout<<int(ans)+1<<endl;
}
return 0;
}
3.素数定理
素数定理(prime number theorem)是素数分布理论的中心定理,是关于素数个数问题的一个命题: [1] 设x≥1,以π(x)表示不超过x的素数的个数,当x→∞时,π(x)~Li(x)或π(x)~x/ln(x)。(Li(x)为对数积分)
求2-10exp(n)的素数
思路:直接套公式即可
4.
给出一个数 分解成多个质数相乘,求最小的两个质数的积(不去重),否则输入-1;
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
LL a[110];
int t,n;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
vector<LL> v;
for(int i=0;i<n;i++)
{
for(int j=2;(LL)j*j<=a[i];j++)
{
while(a[i]%j==0)
{
v.push_back(j);
a[i]/=j;
}
}
if(a[i]!=1) v.push_back(a[i]);
}
sort(v.begin(),v.end());
if(v.size()<2) printf("-1\n");
else printf("%lld\n",v[0]*v[1]);
}
return 0;
}
5.斯特林公式
求n!复杂度为o(n)