输出不超过n的所有素数 (筛法)

O(nlogn) 的算法,还不错。

思想:

设置2为素数,然后划去所有2的倍数

然后查找2后面第一个没被划去的数(为3),然后知道3为素数,划去所有3的倍数

然后查找3后面第一个没被划去的数,由于4已经被划掉,所以下一个将会找到5,划去所有5的倍数...

以此类推

 

需要注意的三点是:

(1)遇到合数则跳过

(2)划去素数p的倍数时,从p*p开始划去,因为p*m (m < p)的数已经被划去了(它是m的最小质因子的倍数)

(3)由(2),在划去时,所有的大于 sqrt(n) 的素数都不用划去它的倍数,直接跳过


代码如下:


#include <stdio.h>
#include <time.h>
#include <math.h>
#include <windows.h>


inline int GetPrimes(int MAX_NUMBER)
{
	int start = clock();
	
	ULONG Count = 0;
	BYTE* List;
	List = new BYTE[MAX_NUMBER + 1];
	memset(List, 0x01, MAX_NUMBER + 1);

	int tmp = sqrt(MAX_NUMBER);
//	List[2] = 1;
	for (int i = 2; i <= 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值