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;  
    } 
  • 相关阅读:
    【分享】Audio工程测试1080p yuv422 10bit编码,软件报告VCU能力不足
    VLC和Gstreamer配合
    【分享】在MPSoC ZCU106单板上运行Docker
    python之(25)中级总结(3)关系型数据库(mysql和oracle使用)
    python之(24)中级总结(2) 时间模块,json和xml模块学习总结
    Java从入门到实战之(33)Java中23种设计模式之5种创建式模式
    python之(23)中级总结(1) 正则表达式和内置函数学习总结
    python之(22)基础总结(5)
    SparkSQL构建用户画像
    Python机器学习(九十八)机器学习算法原理解析
  • 原文地址:https://www.cnblogs.com/wft1990/p/6985274.html
Copyright © 2011-2022 走看看