zoukankan      html  css  js  c++  java
  • 素数筛

    题意:筛选出1~n的所有素数

    一、普通筛法

    基本思想:素数的倍数一定不是素数

    时间复杂度:O(N*loglogN)

    不足:一个合数可能被筛选多次,如6可被2和3筛选出来。

     1 void Prime ()
     2 {
     3     memset(check,0,sizeof(check));//用来标记是否是合数
     4     for(int i=2; i <= N; i++)
     5         if(check[i]==0){
     6             prime[ct++]=i;//存储素数
     7         for(int j=i+i;j<=n;j+=i)
     8             check[j]=1;
     9     }
    10 }

    二、线性筛(欧拉筛法)

    时间复杂度:O(N)

    原理:保证每个合数只被它最小的那个质因子筛选。i如果能整除prime[j],则i肯定是合数,i中有质因子小于或者等于prime[j],所以到此终止,后面的prime[]会比i的那个质因子大

     1 void Prime(){
     2     memset(check,0,sizeof(check));
     3     int cnt=0;
     4     for(int i = 2; i<N; i++){
     5         if(!check[i])
     6             prime[cnt++]=i;
     7         for(int j=0;j<cnt && prime[j]*i<N; j++){
     8             check[i*prime[j]] = 1;
     9             if(i % prime[j]==0)
    10                 break;
    11         }
    12     }
    13 }
  • 相关阅读:
    nginx实现文件分享
    DataTable.Compute强大的功能
    flink学习01
    flink学习02
    ASIS TOBE
    Oracle安装
    运营与运维
    用户与租户的区别
    书的复制记录方案DP
    模拟题5
  • 原文地址:https://www.cnblogs.com/yanchaoyi/p/9722157.html
Copyright © 2011-2022 走看看