素数筛

// 素数筛
/* 原理 :
开一个标记数组,全部初始化为 true,0、1不是素数,直接从数组里划掉。 
紧跟着在 0、1后面的【最小的素数】是 2。 
从2开始,凡是2的倍数、且小于100000的,全部标记为false。 
再找2以后的、是【素数】的下一位数,是3 
从3开始,凡是3的倍数、且小于100000的,全部标记为false。 
再找3以后的、是【素数】的下一位数,是5 
从5开始,凡是5的倍数、且小于100000的,全部标记为false。 
这样循环,直到开始的位置大于100000,退出循环。 
这样,所有标记为TRUE的元素的下标全是素数。 	

参考:https://blog.youkuaiyun.com/sdutstudent/article/details/53783051 
*/
#include <iostream>
using namespace std;

const int maxn = 100000;
int aa[maxn];

int main()
{
	int i, j, k;

	k = 1000;  // 假设题目要找的是 0 ~ k 以内的全部素数 
	
	for (i=0;i<maxn;i++)  // 1表示是素数,0表示不是素数
		aa[i] = 1;
	aa[0] = 0;
	aa[1] = 0;
	
	for (i=2;i<k+1;i++) // 起始数(2~k) 
	{
		if (aa[i] == 1)   // 如果这个起始数是素数,才进行进一步的操作 
		{
			for (j=i+1;j<k+1;j++)  // 从 i+1 开始,把凡事 i 的倍数、且小于 k 的数,标记为 0 
				if (j % i == 0) aa[j] = 0;			
		}

	}
	for (i=2;i<k+1;i++)
		if (aa[i]==1) cout<<i<<endl; 
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值