素数筛选法

素数筛选法一直是数论中的重点,你找到的规律越多你的筛选就越快。

先让我们 看一个算法:

#include<stdio.h>
#include<math.h>
#define MAX_P  500
int nList[MAX_P] = {0};
void Calc()
 
{
    int n,p,t,sq=(int)sqrt(MAX_P*2+1);
    for (n=3;n<=sq;n+=2)
    {
        if (nList[n>>1]) continue;
        for (t=n*n;t<=MAX_P<<1;t+=n<<1) //
筛选循环
            nList[t>>1] = 1;
    }
    printf("%5d", 2);
    for (n=t=1;t<MAX_P;++t)
    {
        if (nList[t]) continue;
        printf("%5d", (t<<1)+1);
        if (++n==10)
        {
            printf("\n");
            n=0;
        }
    }
}
int main(void)
{
    Calc();
    getchar();
    return  0;
}

该算法是一种优化的算法,它不仅时间上优化而且在空间上优化了;为什么可以只要开一半的素组,因为素数只可能是奇数(除开2)那么我们可以好好利用该空间;

我们知道奇数除以2是对其取整数了,例如3/2=1,5/2=2......(2*n+1)/2=n;所以我们只要开一半的数组;

for (n=3;n<=sq;n+=2)
    {
        if (nList[n>>1]) continue;
        for (t=n*n;t<=MAX_P<<1;t+=n<<1) //
筛选循环
            nList[t>>1] = 1;
    }
我们都知道对素数的筛选只要到sqrt()就可以了,这里就不证明了,第一个循环是对所有奇数进行筛选,第二个循环是对素数的倍数进行剔除,为什么每次是2*n了,因为n*n是奇数而素数一定是奇数,如果是t+=n;由于t是奇数n也是奇数那么t+=n就是偶数,而t+=2*n就是奇数并且是n的倍数(因为一倍不可能,已证);

如果是它的倍数就标记。

转载于:https://www.cnblogs.com/bo-tao/archive/2011/08/02/2125309.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值