筛素数

素数(prime):又称质数,是指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。或者说素数是只有1和本身两个因数的数。
ps:比1大但不是素数的数叫合数。1和0既非素数也非合数。

下面介绍一个筛选素数较高效率的算法:xxx算法
假如我们要筛出2-100之间的素数,
该算法假设存在一个筛子,该筛子用于存放2-100之间所有的数,

这里写图片描述

由于2的倍数(2除外)都是合数,所以将这些数筛去。

这里写图片描述“`

3的倍数(除3)同样都是合数,筛去
这里写图片描述

同样道理,筛去5、7的倍数,最终得到100以内的素数:
这里写图片描述

如上,依次筛去2、3、5、7的倍数,就可以得到100以内的素数。

值得讨论的是,为什么筛到7为止?不试试11?

不妨假设筛完7的倍数后还存在11的倍数,既存在不超过100且能整除11的数,那么该数除以11必得到一个小于11的数(因为11*11>100,设该数为x),如果x为素数,那么x已经被筛过(小于11的素数都被筛过了),如果x为合数,那么x同样已经被筛过(x小于11,故x一定存在小于11的质因子),综上,筛完7的倍数后不可能存在11或者更大的的素数的倍数。

事实上,假设求n(包括n)以内的素数,需用2~p 范围内的素数来筛,那么p为不超过且最接近(int)√n 的素数。
例如,(int)√100 == 10,7是不超过且最接近10的素数。

在使用xxx算法进行100以内素数筛选时,只需执行4次筛选就完成了任务,效率非常高。如果需要筛选的范围更大,由于只需要选择已经筛选过的素数对后面的数进行筛选,可以快速筛选出后面的素数。

代码如下:

#include <cstdio>
#include <iostream>
using namespace std;
int main(){
    int maxn=1000;
    int is_prime[maxn];
    for(int i=0;i<=maxn;i++)
        is_prime[i]=1;
    for(int i=2;i*i<=maxn;i++)
        for(int j=i*2;j<=maxn;j++){
            if(!is_prime[j])
                continue;
            if(j%i==0)
                is_prime[j]=0;
        }
    int cnt=0;
    for(int i=2;i<=maxn;i++){
        if(is_prime[i]){
            printf("%4d",i);
            cnt++;
            if(cnt%5==0)
                cout<<endl;
        }
    }
    return 0;
}

最后,介绍几个关于素数的定理:
1. 在 (a,2a] 只间必有一个素数
2. 存在任意长度的素数等差数列
(对于任意值K,存在K个成等差数列的素数,例如K=3,有数列3,5,7 ; K=5,有数列5,17,29,41,53)
3. 。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值