zoukankan      html  css  js  c++  java
  • 质数筛选法:Eratosthenes筛选法与欧拉筛选法

    第一种:开根号,这里不再重述

    第二种:Eratosthenes筛选法  

     原理:利用倍数,讲非素数筛选掉

     code:

     1 int vis[maxn];
     2 void Prime()
     3 {   
     4     vis[0] = 1;
     5     vis[1] = 1;
     6     for(int i = 2; i <= maxn; i++) //任何数的倍数都标记为1证明其不是素数
     7     {
     8         if(!vis[i])
     9         {
    10             for(int j = i*2; j <= maxn; j += i)
    11             {
    12                 vis[j] = 1;
    13             }
    14         }
    15     }
    16 }

    第二种:欧拉筛法

     原理:每个合数都会被它的最小因子筛掉,而我们的最小因子即记录在 Prime 数组(就是拿已经筛选出来的素数乘当前的数i,结果即为合数,筛掉),详细看代码注释

     code:

     1 bool vis[100001]={1,1};//0,1均既不是素数,也不是和数,所以先标记为不是
     2 int Prime[100001],k;
     3 void prime(long long num)
     4 {
     5     for(int i=2;i<=n;i++)//最小的素数是2
     6     {
     7         if(!vis[i])
     8         {
     9             Prime[++k]=i;//如果是素数就标记一下
    10          }
    11         for(int j=1;j<=k;j++)//j小于当前所有的素数的个数
    12         {
    13             if(Prime[j]*i>num)//如果已经大于最大的范围也没必要再往后筛选了
    14             {
    15                 break;
    16             }
    17             vis[Prime[j]*i]=true;//用素数依次×i,结果标记为合数
    18             if(i%Prime[j]==0) //每个数被它的最小因子晒掉 筛掉就break即可
    19             {
    20                 break;
    21             }
    22         }
    23     }//欧拉筛法,就是拿当前的数×之前的筛出来的素数,这个数即为合数
    24 }

     

  • 相关阅读:
    第十八章、使用集合
    第十九章、枚举集合
    第十七章、泛型概述
    第十六章、使用索引器
    第十五章、实现属性以访问字段
    第十四章、使用垃圾回收和资源管理
    第十三章、创建接口和定义抽象类
    AtCoder Grand Contest 018 E
    AtCoder Regular Contest 059 F Unhappy Hacking
    Codeforces 464E. The Classic Problem
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13121136.html
Copyright © 2011-2022 走看看