美文网首页
Eratosthenes素数筛

Eratosthenes素数筛

作者: BUG_7621f | 来源:发表于2019-12-13 22:07 被阅读0次

今天我们要学习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;
            }
        }
    }
}

相关文章

  • Eratosthenes素数筛

    今天我们要学习素数筛,可以快速筛选出素数。讲解之前,别忘了收藏我的编程专题哦筛法理念 将合数从一堆数里面筛出,只留...

  • 求小于等于n的质数个数

    埃氏筛法(Eratosthenes筛选法)算法基本思想:要得到自然数n以内的全部素数,必须把不大于n1/2的所有素...

  • 机试常用算法和题型-数学专题

    数学专题,模拟 素数问题,普通筛和埃氏筛 另一种筛法,连续素数求和得超级素数 质因数 奇数魔方图 求小数的循环部分...

  • 数论

    数学问题 1. 质数筛 埃氏筛 利用当前已经找到的素数,从后面的数中筛去当前素数的倍数,由预备知识一可知,当前素数...

  • 素数筛

  • 素数筛

    素数筛【并发特性】(个人理解) GenerateNatural()函数,用于生成自然数序列,并返回一个自动获取自然...

  • 素数相关问题练习 C++

    辗转相除 素数判定 埃氏筛法

  • 线性筛素数

    对于每一个数: 1.若为素数,由于自身只能被1和自己整除,所以在筛素数时不会被筛去。 2.若为合数,由于一定能被素...

  • 204. Count Primes

    n以内素数的个数。 参考:埃拉托斯特尼筛法和素数判断 代码:

  • 素数筛法——2. 素数

    素数问题 题目描述 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)...

网友评论

      本文标题:Eratosthenes素数筛

      本文链接:https://www.haomeiwen.com/subject/xqmqnctx.html