Eratosthenes素数筛

2019-12-13  本文已影响0人  BUG_7621f

今天我们要学习Eratosthenes素数筛,可以快速筛选出素数。
讲解之前,别忘了收藏我的编程专题哦
筛法理念


将合数从一堆数里面筛出,只留下质数。

筛选过程

先创建一个“数堆”,开多大自己定(一定记住设为全局变量,因为后面我们要写函数)。
尽量把数组开大一点,这是一个好习惯。

bool num[10005]

然后写一个函数,将“数堆”初始化为true(假设全是素数)。
初始化从2开始,因为1不是素数哦。

void Eratosthenes(){
    for(int i=2;i<=10000;i++){
        num[i]=true;
    }
}

筛掉除了2这个素数的所有偶数

for(int i=4;i<=10000;i+=2){
    num[i]=false;
}

如果是3,5,7……的倍数,也要筛掉
下面的第一个for循环是枚举质数。但例如9,它不是质数,它的倍数已经被算在3的倍数里了,何必去浪费这个时间呢?这就是if的作用。由于i是个质数,所以j从i的第一个倍数(i*2)开始筛出合数。

for(int i = 3;i <= N;i+=2){ 
    if(num[i] == true){
        for(int j= 2*i ;j <= N;j += i){
            num[j] = false;
        }
    }
}

示例代码

bool num[10005]
void Eratosthenes(){
    for(int i=2;i<=10000;i++){
        num[i]=true;
    }
    for(int i=4;i<=10000;i+=2){
        num[i]=false;
    }
    for(int i = 3;i <= N;i+=2){ 
        if(num[i] == true){
            for(int j= 2*i ;j <= N;j += i){
                num[j] = false;
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读