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;  
    } 
  • 相关阅读:
    【Linux】在Linux上,使用校园出校器拨号的一个脚本。
    【Android】编译CM10.1遇到的错误解决方案
    【Android】编译CM10遇到的错误解决方案
    【Android】CM在repo中使用local manifest
    一个网站的诞生 MagicDict开发总结1 [首页]
    我记录网站综合系统 1.6发布
    带有ToolTip的ListBox
    字符串的宽度
    .NET开发的文本编辑器,(又发明轮子了,VB代码,不喜误入)
    捕获输入内容
  • 原文地址:https://www.cnblogs.com/wft1990/p/6985274.html
Copyright © 2011-2022 走看看