试除法求质数
void solve()
{
int n;
cin>>n;
bool flag=true;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
flag=false;
break;
}
}
if(flag) cout<<"is Prime!";
else cout<<"not Prime! ";
}
对于求出n以内的所有质数就用到下列筛法
朴素筛,O(nlogn)
用一个数筛掉他的所有倍数
int isprime[N];
void solve1()
{
int n;
cin>>n;
isprime[0]=isprime[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=2*i;j<=n;j+=i)
{
isprime[j]=1;
}
}
}
埃氏筛O(nlognlogn)
用质数筛掉他的倍数,减少朴素筛法的重复
void solve1()
{
int n;
cin>>n;
isprime[0]=isprime[1]=1;
for(int i=2;i<=n;i++)
{
if(!isprime[i])
{
for(int j=2*i;j<=n;j+=i)
{
isprime[j]=1;
}
}
}
}
最后当然是牛逼克拉斯的线性时间复杂度的筛法--------欧拉筛!!!!!
欧拉筛O(n)
对于任意合数都可以写成他的质因子之积,等等均为质数),
欧拉筛就是让每一个合数只被自己的最小质因子筛掉,这样就避免合数被重复筛掉的问题,降低了时间复杂度!!!太强了!!
const int N = 1e6+10;
int prime[N],isprime[N];
int cnt;
void solve3()
{
int n;
cin>>n;
isprime[0]=isprime[1]=1;
for(int i=2;i<=n;i++)
{
if(!isprime[i])
{
prime[++cnt]=i;
}
for(int j=1;i*prime[j]<=n;j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
!