总结--素数(1)

素数筛选与判断有多种方法

以下是筛选与判断的结合;

实现这种结合主要是解决筛选法空间的不足,筛选法需要大数组保存数字的判断结果,而将筛选法与判断结合将极大地加快判断素数,这样就可以很大程度地摆脱了数组空间不足的问题而实现对素数的判断

以下是实现代码:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值