欧拉筛求质数(c++)

假如要求2至20所有的质数:

1.建立两个数组a[20]和pri[20](pri数组中只存储质数 

2.令i=2。从2开始依次遍历所有数,如果2是质数,将2放入pri数组,然后用2乘pri数组内的数并标记(标记4)

pri:2

3.令i+1=3。因为3未标记,所以将3放入pri数组。3依次乘pri数组内的所有数并标记(标记6,9),这些标记的数不是质数。

pri:2 ,3

4.令i+1=4。当4乘2时,发现4%2==0即4是2的倍数,这时就不用往后乘了(标记8),因为4标记

了,所以不放入pri数组。

5.令i+1,以此类推,直至遍历完a数组内所有数,最后输出pri数组内的数即质数。

优点:不会重复标记同一个数,提高效率。因为要保证每一个标记的数都是最小两个因子之和。

如:12=3*4=3*2*2=2*6,这时就选12=2*6;

以下是求100000内的质数程序:

#include<iostream>
using namespace std;
int main() 
{
	int a[100000]={0},pri[10000];     //pri数组中只存储质数 
	int num,i,j;
	num=0;
	for(i=2;i<100000;i++)
	{
		if(a[i]==0)
		{
			pri[++num]=i;
		}
		for(j=1;j<=num;j++)
		{
			if(pri[j]*i>100000)
			{
				break;
			}
			a[i*pri[j]]=1;
			if(i%pri[j]==0)        //i是获取过程中的一个普通数字(即可能是质数,也可能是合数) 
			{
				break;
			}
		}
	}
	for(i=1;i<=num;i++)
	{
		cout<<pri[i]<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值