素数筛选与判断有多种方法
以下是筛选与判断的结合;
实现这种结合主要是解决筛选法空间的不足,筛选法需要大数组保存数字的判断结果,而将筛选法与判断结合将极大地加快判断素数,这样就可以很大程度地摆脱了数组空间不足的问题而实现对素数的判断
以下是实现代码:
#include<iostream>
#include<string>
#define max 1000000
using namespace std;
bool examine[max];
int prime[max];
void set()
{
int i,j,k;
k=0;
memset(examine,0,sizeof(examine));
for(i=2;i<max;i++)
{
if(!examine[i])
prime[k++]=i; //用prime数组储存素数
for(j=0;j<k && prime[j]*i<max;j++)
{
examine[prime[j]*i]=1; //每个素数的i的倍数均为合数
if(i % prime[j]==0)
break;
}
}
}
bool judge(long long n)
{
for(int i=0;prime[i]*prime[i]<=n;i++) //这里不用sqrt函数主要是重复运算sqrt函数需要较长时间
{
if(n % prime[i]==0) return false;
}
return true;
}
int main()
{
long long n;
set();
while(cin>>n)
{
if(judge(n))
cout<<n<<" is a prime number"<<endl;
else
cout<<n<<" is not a prime number"<<endl;
}
}