社团学习成果,素数筛

2018.1.24更新。

添加一个学长给的线性筛法(欧拉筛):

从小到大对于每个已知的素数Pj,筛去i * Pj,当i是pi的倍数时后面的停止。

筛去i*pj,也就是用i*pj的最小质因数pj筛去了它。

当i是pi的倍数时后面的停止,也就是让一个数只能由它的最小质因数筛去它。

举例本来60会被2,3,5都筛一遍,但是现在60只会被2筛去(当i为30时筛去)。

bool isPri[maxn];//0为素数,1为合数
int Pri[maxn / 10];//记录素数
void getPri(){
    memset(isPri, 0, sizeof(isPri));
    isPri[0] = isPri[1] = 1;
    int cnt = 0;
    for(int i = 2; i < maxn; ++i){
        if(!isPri[i]){
            Pri[cnt++] = i;
        }
        for(int j = 0; j < cnt && Pri[j] * i < maxn; ++j){
            isPri[i * Pri[j]] = 1;
            if(i % Pri[j] == 0){
                break;
            }
        }
    }
}
这是慢速的埃氏筛

#define MAXW 1000000
#include <math.h>

int prime[MAXW];
long long i, j, maxw;

int main()
{
    prime[0] = 0;
    prime[1] = 0;
    prime[2] = 1;

    while(scanf("%lld",&maxw)!=EOF&&maxw)
    {
        for(i = 3; i < maxw; i++)//先筛去偶数
            prime[i] = (i&1)?1:0;

        int t = sqrt(maxw);
        for(i = 0; i <= t; i++)//倍数筛
        {
            if(prime[i])
                for(j = i*2; j < maxw; j += i)
                    prime[j] = 0;
        }

        j = 0;
        for(i = 0; i < maxw; i++) if(prime[i]) j++;

        printf("%lld\n", j);
    }
    return 0;
}


指导的学长说还有很多判断素数方法,以后补充。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值