欧拉筛法求素数个数

判断a是否为素数,求1——n的素数个数

考虑欧拉筛法————

  http://wenku.baidu.com/link?url=dFs00TAw8_k46aeSbXy5nB5LVqJ51uUJgY9zVWEDQdwjLN-qLFWZuYcGPE5EDcztNQAMtKfUbSseBvfBzV4fcQvlneOVHJJQvgJjcGC1iN7

//判断是否为素数;计算1到n的素数个数 
#include<iostream>
#include<cstring>
#define MAX 10000000
using namespace std;
bool b[MAX+1];   //b中0表示为质数,1表示为非质数 
int c[MAX+1];
int sushu(int n){
    memset(b, 0, n + 1);
    b[0]=1;
    b[1]=1;     //1既非素数也非合数 
    int i, j, cnt = 0, t;
    for (i = 2; i <= n; i++){
        if (!b[i]){
            c[cnt++] = i;
        }
        for (j = 0; j<cnt; j++){
            t = i*c[j];  //质数乘质数为合数,质数乘合数为合数,一个合数必可写成质数乘一个数的形式 
            if (t > n)
                break;
            b[t] = true;
            if (i%c[j] == 0)
                break;
        }
    }
    return cnt;
}

int main()
{
    int T,a,n,c;
    cin>>T;
    while(T--)
    {
        cin>>a>>n;
        c=sushu(n);
        if(b[a]==0)
            cout<<"YES "<<c<<endl;
        else
            cout<<"NO "<<c<<endl;    
    }
    return 0;
}

 

 

看看别人的代码,10亿秒了,,

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
int n=11000000;
bool visit[11000000];
int  prime[11000000];

void init_prim()
{
    memset(visit, true, sizeof(visit));
    visit[0] = visit[1] = false;
    int num = 0;
    for (int i = 2; i <= n; ++i)
    {
        if (visit[i] == true)
        {
            num++;
            prime[num] = i;
        }
        /*for (int j = 1; ((j <= num) && (i * prime[j] <= n));  ++j)
        {
            visit[i * prime[j]] = false;
            if (i % prime[j] == 0) break;
        }*/
        for(int j = 2 ;  i *j <=n; j++)
        {
          visit[i * j] = false;
        }
    }
}

int OutNum(int n)
{
    int i;
    for(i=1;prime[i]<=n;i++);
        return i-1;
}

int main()
{
    clock_t start, finish;
    double  duration;
    start = clock();
    init_prim();
    int T;
    cin >> T;
    while(T--)
    {
        int x,n;
        cin >> x >> n;
        if(visit[x])
            cout << "YES" << " ";
        else 
            cout << "NO" << " ";
            
        cout << OutNum(n) << endl;
    }
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC*1000.0;
    printf( "%f ms\n", duration );
    return 0;
} 

 

posted @ 2015-12-16 16:04  Nagihiko  阅读(524)  评论(0编辑  收藏  举报