zoukankan      html  css  js  c++  java
  • 欧拉筛法求素数个数

    判断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
    ", duration );
        return 0;
    } 
  • 相关阅读:
    centos/7下安装mysql5.7
    ubuntu下用vagrant搭建集群环境
    ubuntu下pyspark的安装
    Ubuntu下teamviewer的安装
    volatile(一)
    synchronized(九)
    synchronized(八)
    synchronized(七)
    synchronized(六)
    synchronized(五)
  • 原文地址:https://www.cnblogs.com/fengyanlover/p/5051430.html
Copyright © 2011-2022 走看看