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\n",f[i]);  
    }  
    return 0;  
} 

 

posted @ 2017-06-11 15:13  泡面小王子  阅读(964)  评论(0编辑  收藏  举报