zoukankan      html  css  js  c++  java
  • Eratosthenes筛选法

    Sieve of Eratosthenes

    筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

     

    开始使用埃拉托斯特尼筛选法计算小于100000的素数。

    埃拉托斯特尼筛选法是最为知名的产生素数的筛选法,适用于产生最小的N个素数。

    该方法的唯一缺点是使用的存储空间大,可以进一步改进。

    另外,该算法也不适用于计算某个范围内的全部素数。

    C++版使用的标志是布尔标志,比起C语言版(用整数数组作为标识太浪费空间;用位运算逻辑太复杂,易出错),使用的空间上改进相当多,并且逻辑也十分简单。

    这是一个基础程序,用到的时候可以拷贝修改加以利用。

    程序如下:

    #include <iostream>
    #include <cmath>
    using namespace std;
    const int MAXN=100000;
    bool sieveflag[MAXN]={false,false,true};
    
    void esieve(bool sflag[],int n)
    {
        //初始化
        for(int i=3;i<MAXN;i++)
        {
            sflag[i++]=true;
            sflag[i]=false;
        }
        //筛选
        int max=sqrt(n);
        for(int i=3;i<=max;i++)
        {
            if(sflag[i])
            {
                for(int j=i<<1;j<=n;j+=i)
                {
                    sflag[j]=false;
                }
            }
        }
    }
    int main()
    {
        esieve(sieveflag,MAXN);
        int num=0;
        for(int i=2;i<=MAXN;i++)
        {
            if(sieveflag[i])
            {
    
                ++num;
                cout<<num<<":"<<i<<endl;
            }
        }
        return 0;
    }

    Largest prime factor(hdu 2136)

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3961    Accepted Submission(s): 1393

    Problem Description
    Everybody knows any number can be combined by the prime number. Now, your task is telling me what position of the largest prime factor. The position of prime 2 is 1, prime 3 is 2, and prime 5 is 3, etc. Specially, LPF(1) = 0.
     
    Input
    Each line will contain one integer n(0 < n < 1000000).
     
    Output
    Output the LPF(n).
     
    Sample Input
    1 2 3 4 5
     
    Sample Output
    0 1 2 1 3
     
    #include<stdio.h> 
    #include<string.h> 
    #define N 1000000  
    int f[N];  
    int main()  
    {  
        int i, j, co=0;  
        memset(f, 0, sizeof(f));  
        for (i=2; i<=N; i++)  //对当前数的每个数的倍数进行赋值素数编号,可以覆盖,因为要覆盖为最大因子 
        {  
            if (f[i]==0)  
            {  
                co++;//素数的位置 
                for (j=i; j<=N; j+=i) //构造出j的暂时最大素数因子的位置 
                   f[j] = co;  
                  
            }  
        }  
        while(scanf("%d",&i)!=EOF)  
        {  
            printf("%d
    ",f[i]);  
        }  
        return 0;  
    } 
  • 相关阅读:
    题解 AT5228 【[ABC162A] Lucky 7】
    题解 P6467 【[COCI2008-2009#6] BUKA】
    2020 Codeforces 愚人节比赛题解 A~D
    题解 AT4251 【[ABC110A] Maximize the Formula】
    题解 AT5638 【November 30】
    题解 AT4164 【[ABC102A] Multiple of 2 and N】
    多项式全家桶
    烂题推荐
    NOIP 2020 游记
    P5048 题解
  • 原文地址:https://www.cnblogs.com/wft1990/p/6985274.html
Copyright © 2011-2022 走看看