zzulioj1369: 素数统计

#include <bits/stdc++.h>
using namespace std;
int x[2000001],y[2000001];
int main(){
    int i;
    for (i=2;i<=2000000;i++)x[i]=1;
    for (i=2;i<=2000000;i++){
            if (x[i]){
                for (int j=2*i;j<=2000000;j+=i){
                    x[j]=0;
                }   
            }   
            y[i]=y[i-1]+x[i];
        }
    int a,b;
    while (scanf("%d %d",&a,&b)!=EOF){
        cout<<y[b]-y[a-1]<<endl;         
    }          
}
          

在本校oj网站上遇到的题,求[a,b] 里头的素数的个数,多组数据,且数据很大,只能建立个素数数组了,刚开始的想法是建立a[n]   表示第x(x<n) 个素数是a[x],很普通的方法,很不聪明的方法,太复杂力!!!!!

于是了解到了埃氏筛选法,首先储存方式和上面不一样,下标和储存的数据完全和上面的相反,a[n],储存的数为1表示该下标为素数,0则......,从2开始是个素数,2的所有小于边界的倍数都为0...........,确实哈呀一!!唯一的缺点可能是开的数组要很大,开了两个x[2000000] (下一段会讲到为啥要两个)

题目要求的是求区间素数的个数,相加就行了,第一次我是循环求和(真蠢,果然TLE了,然后我就想到了前缀和可以快速求前n项和,于是开了个y[2000000],求其前缀和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值