您的位置:首页 > 其它

素数筛法

2016-09-22 17:26 162 查看
1.朴素

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int cnt;
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
cnt++;
break;
}
}
cout<<n-1-cnt<<endl;
}


2.Eratosthenes筛法

把每一个质数的倍数都筛掉

#include<iostream>
#include<cstdio>
using namespace std;
bool prime[10000001];
int cnt;
int main()
{
int n;cin>>n;
//注意:0表示是,1表示不是
prime[1]=1;
for(int i=2;i<=n;i++)
if(!prime[i])
for(int j=i;j<=n/i;j++)
//从和自己相等的数开始
{
prime[i*j]=1;
}
for(int i=1;i<=n;i++)
if(!prime[i])
cnt++;
cout<<cnt<<endl;
}


3线性筛

每一个不是质数的数都用最小的因子筛掉。

一开始把所有数都定义为素数,把 [从最小的质数开始* 当前的数的结果数 ]筛掉,如果当前数是小质数的倍数,则退出,原因在于如果这个数是小质数的倍数,当它乘以小质数的下一个质数得结果依然可以被小质数除尽。例如当前数为8,小质数为2,3,5,那么8*2=16被筛掉,而且8%2==0,所以 3 * 8=24就不筛了,因为8是2的倍数,那么3 * 8也一定是2的倍数,因此24这个数使可以被更小的质数2筛掉的。

#include<iostream>
#include<cstdio>
using namespace std;
int prime[10000005];
bool flag[10000005];
int n,cnt;
int main()
{
cin>>n;
for(int i=2;i<=n;i++)
flag[i]=1;
for(int i=2;i<=n;i++)
{
if(flag[i])
prime[++cnt]=i;
//for(int j=1;prime[j]<=i && prime[j]*i<=n;j++)
//prime不赋初值,如何保证小于i?
for(int j=1;j<=cnt && prime[j]*i<=n;j++ )
{
flag[prime[j]*i]=0;
if(!i%prime[j])
break;
}
}
cnt=0;
for(int i=1;i<=n;i++)
if(flag[i]==1)
cnt++;
cout<<cnt<<endl;
}


11.27

#include<iostream>
#include<cstdio>
using namespace std;
int n,flag,cnt=1;
int prime[10000001];
int main()
{
//  freopen("in.txt","r",stdin);
//  freopen("out1.txt","w",stdout);
cin>>n;
prime[cnt]=2;
for(int i=3;i<=n;i++)
{
flag=0;
for(int j=1;j<=cnt && prime[j]<i;j++)
{
if(i%prime[j]==0)
{
flag=1;break;
}
}
if(flag==0) prime[++cnt]=i;
}
//  for(int i=1;i<=cnt;i++)
//      cout<<prime[i]<<" ";
cout<<cnt<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: