素数筛选法

素数的求解在很多题目当中都会用到,最常见的就是直接暴力判断

bool isprime(int number)
{
    if(number==1) return 0;
    if(number==2) return 1;
    for(int i=2;i*i<=number;i++)
    {
        if(number%i==0) return 0;
    }
    return 1;
}

但是这种方法是一种糟糕的方法,它的耗时是巨大的,所以我们需要寻找更好的方法来解决这个问题

我们知道,最大公约数只有1和它本身的数叫做素数,那么只要剔除2 3 4 5 6...的倍数,得到的数就是素数

代码:

const int maxn = 1e7+5;
int p[maxn];
void isplural() //是否为合数
{
    memset(p,0,sizeof(p));
    p[1]=1; //一非质数非合数
    p[0]=1; //零非质数非合数
    for(int i=2; i*i<maxn; i++)
    {
        if(!p[i])
        {
            for(int j=i*2; j<maxn; j+=i)
                p[j]=1;
        }
    }
}

除了剔除2,3,4,5,6..的倍数,还有两种方法筛选素数,具体参考三种素数筛选法详解

相关知识:

1.最大公约数只有1和它本身的数叫做质数(素数)
2.高斯猜测,n以内的素数个数大约与n/ln(n)相当,或者说,当n很大时,两者数量级相同。这就是著名的素数定理。  
3.十七世纪费马猜测,2的2^n次方+1,n=0,1,2…时是素数,这样的数叫费马素数,可惜当n=5时,2^32+1就不是素数,
  至今也没有找到第六个费马素数。
4.18世纪发现的最大素数是2^31-1,19世纪发现的最大素数是2^127-1,20世纪末人类已知的最大素数是2^859433-1,用十进制表示,这是一个258715位的数字。
5.孪生素数猜想:差为2的素数有无穷多对。目前知道的最大的孪生素数是1159142985×2^2304-1和1159142985×2^2304+1。
6. 歌德巴赫猜想:大于2的所有偶数均是两个素数的和,大于5的所有奇数均是三个素数之和。其中第二个猜想是第一个的自然推论,因此歌德巴赫猜想又被称为1+ 1问题。我国数学家陈景润证明了1+2,即所有大于2的偶数都是一个素数和只有两个素数因数的合数的和。国际上称为陈氏定理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值