筛选法求素数2

来源:互联网 发布:卖肉漫画软件 编辑:程序博客网 时间:2024/05/21 02:21

一般算法

#include <iostream>      using namespace std;           const int MAX=100;      bool isPrime[MAX+1];      int total;//计数      int prime[MAX+1];   void makePrime1()  {      memset(isPrime, 1, sizeof(isPrime));      isPrime[0]=false;      isPrime[1]=false;      for (int i=2;  i<=MAX;  i++)          if (isPrime[i]) {              prime[total++]=i;              for (int k=i*i; k<=MAX; k+=i)                   isPrime[k]=false;          }  }   

#include<stdio.h>#include<math.h>#define N 10000001bool prime[N];int main(){   int i, j;   prime[0]=prime[1]=0,prime[2]=1;   for(i=3; i<N; i++)    if(i%2) prime[i]=true;  else prime[i]=false;   for(i=3; i<=sqrt(N); i+=2)   {   if(prime[i])       for(j=i+i; j<N; j+=i)            prime[j]=false;   }   for(i=2; i<100; i++)//由于输出将占用太多io时间,所以只输出2-100内的素数。可以把100改为N    if( prime [i])         printf("%d ",i);   return 0;}



线性筛选法

void makePrime2()    {        memset(isPrime,true,sizeof(isPrime));        memset(prime,0,sizeof(prime));        for(int i=2;i<=MAX;i++)        {            if(isPrime[i]) prime[total++]=i;           for(int j=0; j<total && i*prime[j]<=MAX; j++)            {                isPrime[i*prime[j]]=false;                 if(i%prime[j]==0) break;           }        }    }    

记录每个数的最大素因子

memset(s,0,sizeof(s));s[1]=1;for(i=2;i<MAX;i++)//筛选所有范围内的素数{if(s[i]==0)for(j=i;j<MAX;j+=i){s[j]=i;}}




0 0