Eratosthenes筛法是一种素数筛,时间复杂度nlogn。

主要思想就是,对于小于n的素数p,删除2p,3p,4p……

筛法的代码可以写成:

memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) for(int j=i*2;j<=n;j+=i) vis[j] = 1;

虽然这样已经很快了,但是还是可以进一步优化。

int M = sqrt(n+0.5)
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) if(!vis[i])for(int j=i*i;j<=n;j+=i) vis[j] = 1;

内层循环不用每次从i*2开始,小于i的在之前就已经筛掉了,所以只要从i*i开始就可以,所以第一层循环也就不必循环到n,只要循环到根号n就可以。

代码很简单,在此想引入一下素数定理:,素数定理可以用于预处理时,开数组的大小。

其中Π(x)表示不超过x的素数的个数,就是它和x/lnx比较接近。

筛法很简单,只要是如何利用这个筛法的思路去解题。

紫书上面有一道题是这样的:

无平方因子数

给出正整数n和m,区间的[n,m]内的“无平方因子”的数有多少个?

无平方因字数是指,对于数p,不存在任意k>1,使得p是k^2的倍数,那么p是无平方因字数。

这道题就可以用埃式筛法的思想来解:对于不超过根号m的所有素数p筛掉区间[n,m]内p^2的所有倍数。

代码也十分类似:

int M = sqrt(n+0.5)
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) if(!vis[i])for(int j=i*i*i;j<=n;j+=i*i) vis[j] = 1;

下面这道题是牛客网的一道题。

题目链接:https://www.nowcoder.com/acm/contest/71/A

链接:https://ac.nowcoder.com/acm/contest/71/A?&headNav=www
来源:牛客网

题目描述

给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数

输入描述:

第一行输入一个n

接下来一行输入n个正整数ai

输出描述:

输出符合条件个数

示例1

输入

5
1 2 3 4 5

输出

2

说明

5个数中1和2符合条件,1是后面每个数的因子,2是4的因子

备注:

1≤n,ai≤1000000

同样是埃式筛法的思想,对于这n个数中的每一个数p找到所有p的倍数,记录个数。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;const int N=1e6+5;
int b[N],a[N],sum;
int main()
{int n;cin>>n;for(int i=0; i<n; i++)cin>>a[i],b[a[i]]=1;for(int i=0; i<n; i++){if(a[i]==1){sum++;continue;}for(int j=a[i]+a[i]; j<N; j+=a[i])if(b[j]==1){sum++;break;}}printf("%d\n",sum);system("pause");return 0;
}

Eratosthenes筛法相关推荐

  1. Eratosthenes筛法求1-100之间的素数

    /* 写出不超过100的所有的素数. 解  将不超过100的正整数排列如下: 1   2   3   4   5   6   7   8   9  10 11  12  13  14  15  16  ...

  2. 素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码

    文章目录 1 概念 2 素数的判断 2.1 思想 2.2 实现代码 3 素数表的获取 3.1 朴素算法 3.1.1 思想 3.1.2 3 实现代码 3.2 Eratosthenes筛法 3.2.1 思 ...

  3. Eratosthenes,筛法求素数

    //筛法求区间[0,n]的所有素数,v为素数表 //v[i]==0,i为素数 void f(int n) {int m=sqrt(n+0.5);memset(v,0,sizeof(v));for (i ...

  4. Eratosthenes筛法求素数

    问题: 求正整数N以内的全部素数. 思路: 1.从最小的素数x开始(x称作筛数),将所有N以内的x的倍数删除. 2.接着x为下一个素数,在此将其倍数删除. 3.重复以上操作,剩下的就是素数. 注意: ...

  5. 厄拉托塞师(Eratosthenes)筛法

    Eratosthenes筛法 素数的定义 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数. 素数是不能继续分解的整数,同样也是关于乘法运算的最小整数 ...

  6. 筛法(Sieve of Eratosthenes)

    Sieve of Eratosthenes 筛法 百度百科 在数学中,Eratosthenes 筛法是一种古老的算法,用于查找任何给定限制内的所有素数. package mainimport &quo ...

  7. c语言素数筛法与分解素因数,质因数分解及代码:

    计算方法 短除法 求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止.分解质因数的算式的叫短除法,和除法的性质差不多,还可以用来求多个个数的公因式: 求最大公因数的一种方法,也可用来求最小 ...

  8. java 埃氏筛法_筛法

    素数与最大公因子2021-02-12 17:32:04 素数 定义: 素数是大于 \(1\) 的正整数, 并且除了 \(1\) 和它本身外不能被其他正整数整除. 素数的数量: 不超过 \(N\) 的素 ...

  9. 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)

    一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题). 二.埃氏筛法(Eratosthenes筛法) 埃氏筛法又叫做Eratosthenes筛法 ...

  10. Java求n以内素数_求0到n之间素数个数的序列(Java)

    要求: (1) 找出0-1000之间素数 (2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法 ...

最新文章

  1. 低配版AI车神?网友用单个CNN在「极品飞车9」里飙车
  2. Hermes实时检索分析平台
  3. Shiro SpringMVC 非maven HelloWorld
  4. 分析及解决SQLServer的死锁问题
  5. 百度2019暑期实习计算机视觉岗位笔试题
  6. 《FPGA入门教程》看书随笔——RTL设计
  7. Java 8将默认使用传输级别安全性(TLS)1.2
  8. C#使用Dotfuscator混淆代码以及加密
  9. python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛
  10. IO流 (一) ----- 基本概念和FIle类
  11. WebDriver API学习记录
  12. iOS开发之开发者账号的申请进度跟进(申请的询问)
  13. uni-app 获取屏幕亮度与设置屏幕亮度
  14. Web报表系统葡萄城报表:报表设计
  15. excel表格,如何按编号换行
  16. python目前的最新版本是_最新版Python 3.8.6 版本发布
  17. linux实现虚拟专用网
  18. Java工作4年来应聘要16K最后没要,细节如下。。。
  19. 新版kettle学习
  20. 静态成员函数访问非静态成员

热门文章

  1. dubbo-Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
  2. Lua参数绑定函数实现方法
  3. 转载:详解C中volatile关键字
  4. HDU 4931 Happy Three Friends(水)
  5. Jquery动态进行图片缩略
  6. jar包引用版本不一致引发的问题
  7. Mybaits的运行原
  8. 清除数据库中大于10W行的垃圾历史数据
  9. nodejs+express中设置登录拦截器
  10. VIM设置-发现VIM的美