zoukankan      html  css  js  c++  java
  • 线性筛法

    【寻物启示】

    我的脑子不小心被我弄丢了,有谁看见我的脑子了,请联系我,谢谢!

    【线性筛法】

    线性筛法是啥,它是筛法。它降低了时空复杂度,如果用暴力的方法求素数,会爆时间。

    【模版】

     1 #include<cstdio>
     2 #include<cstring>
     3 #define MAXN 100005
     4 #define MAXL 1299710
     5 int prime[MAXN];//记录素数的数组 
     6 int check[MAXL]; //check:0是素数,1是合数,
     7 int tot = 0;//tot记录当前得到的素数的个数
     8 memset(check, 0, sizeof(check));
     9     for (int i = 2; i < MAXL; ++i)
    10     {
    11        if (!check[i])//如果它是素数 
    12        {
    13           prime[tot++] = i;//把它存入素数的数组 
    14        }
    15        for (int j = 0; j < tot; ++j)
    16        {
    17           if (i * prime[j] > MAXL)//当溢出时跳出循环 
    18           {
    19              break;
    20           }
    21           check[i*prime[j]] = 1;//素数的i倍都是合数 
    22           if (i % prime[j] == 0)//标记完毕后,跳出循环 
    23           {
    24              break;
    25           }
    26        }
    27     }

    【例题--素数个数】
    <题目描述>

    求{1,2,...,N}中素数的个数。

    <输入>

    1个整数N。

    <输出>

    1个整数,表示素数的个数。

    <样例输入>

    10

    <样例输出>

    4

    <提示>

    对于40% 的数据,1 ≤ N ≤ 106;
    对于80% 的数据,1 ≤ N ≤ 10 7;
    对于100% 的数据,1 ≤ N <6*10 7;

    【代码实现】

    #include<cstdio>
    #include<cstring>
    #define MAXN 100005
    #define MAXL 1299710
    int prime[MAXN];//记录素数的数组 
    int check[MAXL]; //check:0是素数,1是合数,
    int tot = 0;//tot记录当前得到的素数的个数
    int main()
    {
        int n,sum = 0;
        scanf("%d",&n);
        memset(check, 0, sizeof(check));
        for (int i = 2; i < n; ++i)
        {
           if (!check[i])//如果它是素数 
           {
              prime[tot++] = i;//把它存入素数的数组 
           }
           for (int j = 0; j < tot; ++j)
           {
              if (i * prime[j] > n)//当溢出时跳出循环 
              {
                 break;
              }
              check[i*prime[j]] = 1;//素数的i倍都是合数 
              if (i % prime[j] == 0)//标记完毕后,跳出循环 
              {
                 break;
              }
           }
        }
        for(int i = 2;i <= n;i++)
        {
            if(!check[i]) sum++;
         } 
         printf("%d",sum);
         return 0;
    }

    【Orz】orzorzorz

  • 相关阅读:
    时间形式的转换
    vue 按enter键 进行搜索或者表单提交
    关于Cookie 关于前端存储数据
    复杂数组去重
    蜜蜂
    MongoDB学习记录一
    python 基础 day03—函数
    python 基础 day03—文件操作
    python 基础 day02—列表List / 元组Tuple
    python 基础 day02—初识模块
  • 原文地址:https://www.cnblogs.com/peppa/p/8472406.html
Copyright © 2011-2022 走看看