标签:
素数筛选目的是筛选出某一区间[m, n)内的所有素数,常见方法包括如下几种:
1.朴素的筛选法:
先写出判断函数isPrime(),再对区间内的数依次调用isPrime()进行判断,算法核心是以2~根号n作为除数。
#include <math.h> bool isPrime(int n) { /* C++中sqrt有两个重载函数,参数可以是double或float,由于传入参数是int,在默认的隐式类型转换中int可以 转换成float也可以转换为double,则须通过强转告诉编译器该调用哪一个函数。 */ int sqr = (int)sqrt(double(n)); for(int i = 2; i <= sqr; i++) { if(n%sqr == 0) return false; } return true; }
2.高效的筛选法:
借助标记数组,对于2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23……初始时均标记素数,模拟如下剔除合数的过程:
从区间首部开始往后依次考察,如果当前m被标记为素数,那么2*m, 3*m, 4*m……都要标记为合数;如果m被标记为合数,则跳过继续考察m+1……当整个区间全部考察完后,所有素数和合数对照标记数组一目了然。
考察2时:2,3,5,7,9,11,13,15,17,19,21,23……
考察3时:2,3,5,7,11,13,17,19,23……
考察5时:2,3,5,7,11,13,17,19,23……
考察7时:2,3,5,7,11,13,17,19,23……
……
标签:
原文地址:http://www.cnblogs.com/1203ljh/p/4640958.html