素数筛选的方法

素数又称质数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。

求素数的方法

1. 枚举


    
    
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. for( int i= 2;i<n;i++)
  6. if(n%i== 0)
  7. return false;
  8. return true;
  9. }

2. 优化(只需判断到根号n即可)


    
    
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. for( int i= 2;i*i<=n;i++)
  6. if(n%i== 0)
  7. return false;
  8. return true;
  9. }

3. 质数分布规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等 


    
    
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. if(n== 2||n== 3)
  6. return true;
  7. if(n% 6!= 1&&n% 6!= 5)
  8. return false;
  9. //在6的倍数的两侧的数也可能不是质数
  10. for(int i= 5;i*i<=n;i+= 6)
  11. if(n%i== 0||n%(i+ 2)== 0)
  12. return false;
  13. return true;
  14. }

4. 埃式筛选法打表  O(nlogn)


    
    
  1. const int N= 100000;
  2. int a[N]; //a[i]=0表示i是素数
  3. void makeatble(int n)
  4. {
  5. a[ 0]=a[ 1]= 1; //0,1不是素数
  6. for( int i= 2;i<=n;i++)
  7. if(!a[i]){
  8. for( int j=i+i;j<=n;j+=i)
  9. a[j]= 1;
  10. }
  11. }

5.埃式筛选法中合数是作为素数的倍数被筛去的,显然,如果每个合数仅被它最小的质因子筛去,算法的效率会更高。这就是欧拉筛法


    
    
  1. const int N= 10000;
  2. int prime[N+ 1]; //prime[0]存连续素数的个数,prime数组存储连续素数
  3. void getPrime()
  4. {
  5. memset(prime, 0, sizeof(prime));
  6. for( int i= 2;i<=N;i++){
  7. if(!prime[i])
  8. prime[++prime[ 0]]=i;
  9. for( int j= 1;j<=prime[ 0]&&prime[j]<=MAXN/i;j++){
  10. prime[prime[j]*i]= 1;
  11. if(i%prime[j]== 0) //如果prime[j]是i的最小质因子就跳出
  12. break;
  13. }
  14. }
  15. }

练习:

51Nod_1106 质数检测【水题】

51Nod_1181 质数中的质数(质数筛法)【筛选法】

转载来源 : https://blog.csdn.net/SongBai1997/article/details/81604338

素数又称质数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。

求素数的方法

1. 枚举


  
  
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. for( int i= 2;i<n;i++)
  6. if(n%i== 0)
  7. return false;
  8. return true;
  9. }

2. 优化(只需判断到根号n即可)


  
  
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. for( int i= 2;i*i<=n;i++)
  6. if(n%i== 0)
  7. return false;
  8. return true;
  9. }

3. 质数分布规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等 


  
  
  1. bool isPrime(int n)
  2. {
  3. if(n== 1)
  4. return false;
  5. if(n== 2||n== 3)
  6. return true;
  7. if(n% 6!= 1&&n% 6!= 5)
  8. return false;
  9. //在6的倍数的两侧的数也可能不是质数
  10. for(int i= 5;i*i<=n;i+= 6)
  11. if(n%i== 0||n%(i+ 2)== 0)
  12. return false;
  13. return true;
  14. }

4. 埃式筛选法打表  O(nlogn)


  
  
  1. const int N= 100000;
  2. int a[N]; //a[i]=0表示i是素数
  3. void makeatble(int n)
  4. {
  5. a[ 0]=a[ 1]= 1; //0,1不是素数
  6. for( int i= 2;i<=n;i++)
  7. if(!a[i]){
  8. for( int j=i+i;j<=n;j+=i)
  9. a[j]= 1;
  10. }
  11. }

5.埃式筛选法中合数是作为素数的倍数被筛去的,显然,如果每个合数仅被它最小的质因子筛去,算法的效率会更高。这就是欧拉筛法


  
  
  1. const int N= 10000;
  2. int prime[N+ 1]; //prime[0]存连续素数的个数,prime数组存储连续素数
  3. void getPrime()
  4. {
  5. memset(prime, 0, sizeof(prime));
  6. for( int i= 2;i<=N;i++){
  7. if(!prime[i])
  8. prime[++prime[ 0]]=i;
  9. for( int j= 1;j<=prime[ 0]&&prime[j]<=MAXN/i;j++){
  10. prime[prime[j]*i]= 1;
  11. if(i%prime[j]== 0) //如果prime[j]是i的最小质因子就跳出
  12. break;
  13. }
  14. }
  15. }

练习:

51Nod_1106 质数检测【水题】

51Nod_1181 质数中的质数(质数筛法)【筛选法】

转载来源 : https://blog.csdn.net/SongBai1997/article/details/81604338

猜你喜欢

转载自blog.csdn.net/qq_39763472/article/details/82414211