素数筛选函数

原理:任何数的整数倍必定不是素数,大于二的偶数必定不是素数。
假设有一个筛子存放1~N,例如:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ....N



先将2的倍数筛去:

2 3 5 7 9 11 13 15 17 19 21....N



再将3的倍数筛去:

2 3 5 7 11 13 17 19....N



再来将5的倍数筛去,再来将7的质数筛去,再来将11的倍数筛去........,如此进行到最后留下的数就都是质数,这就是 Eratosthenes 筛选方法(Eratosthenes Sieve Method)。


void Erathosthenes()//筛选素数
{
    int n=10000;
    memset(vis,0,sizeof(vis));
    for(int i=2; i<=n; i++)
        if(!vis[i])
        {
            prime[num++]=i;
            for(int j=i*i; j<=n; j+=i)
                vis[j]=i;
        }
 
}


【1】

#include<stdio.h>
#include<string.h>

int prime[20001]; //素数标记数组,非素数置0,素数置1

//筛选函数
void is_prime()
{
    
    
    prime[0]=0;//非素数,置0
    prime[1]=0;//非素数,置0

    for(int i=2; i*i<=20000;i++)  //根号范围内做筛选就可以了
    {
    
    
      /*
         从2开始,进行倍数筛选,剩下序列中的下一个数就是素数。
         因此prime[i]为1的那些i依次为:2,3,5,7,11,13,。。。
       */
        if(prime[i])
        {
    
    
            int j=2*i; //从2倍的i开始
            while( j<=20000)
            {
    
    
                prime[j]=0;
                j+=i; //每次增加1倍的i,即3倍、4倍、5倍、6倍,....
            }
        }
    }

}

//素数筛选函数演示
int main()
{
    
    
    /*先把标记数组中的元素全部置-1,即假定每个数都是素数,
       然后通过筛选把倍数置0,那么剩下"值为-1"的那些元素就是素数.    */
    memset(prime,-1,sizeof(prime));//memset只有置-1和0时才是最保险的,否则有bug

    is_prime();

    //输出来看看
    for(int i=0;i<20001;i++)
    {
    
    
        if(prime[i])
            printf("%d ",i);

        if(i%1000==0)
            putchar('\n');
    }

    return 0;
}

【2】

#include <iostream>
#include <cmath>
#define MAX 100 
using namespace std;

int main()
{
    
    
      //设置标记,将偶数标记为0 
      int prime[MAX+1];
      for(int i=1;i<=MAX;i++)
      {
    
    
        if(i%2==0)
        {
    
    
          prime[i]=0;
        }
        else prime[i]=1;
      }
      
      for(int i=3;i<=sqrt(MAX);i++)
      {
    
    
        if(prime[i]==1)
        {
    
    
          for(int j=i+i;j<=MAX;j=j+i)
          {
    
    
              prime[j]=0;
          }
        }
      }    
      cout<<"2"<<" ";
      for(int i=3;i<=MAX;i++)
      {
    
    
        if(prime[i]==1)
        cout<<i<<" ";
      }
  return 0;  
} 

猜你喜欢

转载自blog.csdn.net/wenrenfudi/article/details/114546674
今日推荐