码迷,mamicode.com
首页 > 其他好文 > 详细

素数筛选法

时间:2015-07-12 15:39:09      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

素数筛选目的是筛选出某一区间[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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!