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;  
    } 
  • 相关阅读:
    声明:此资源由本博客收集整理于网络,只用于交流学习,请勿用作它途。如有侵权,请联系, 删除处理。
    注入点归纳
    网站入侵思路
    关于网上的“人肉”里面的技巧,简单解释
    SQL注入复习
    自己构造注入点方便入侵
    SQL通常注射的一些介绍
    AWVS13破解版安装_Windows
    黑页
    显ipQQ
  • 原文地址:https://www.cnblogs.com/wft1990/p/6985274.html
Copyright © 2011-2022 走看看