【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法
快速查找素数
- 描述
- 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
- 输入
- 给出一个正整数数N(N<=2000000)
但N为0时结束程序。
测试数据不超过100组 - 输出
- 将2~N范围内所有的素数输出。两个数之间用空格隔开
- 样例输入
-
5
10
11
0 - 样例输出
- 2 3 5
- 2 3 5 7
- 2 3 5 7 11
- 【分析】
- 枚举法:
//根据概念判断:
//如果一个正整数只有两个因子, 1和p,则称p为素数.
//代码:
bool isPrime(int n)
{
if(n < ) return false; for(int i = ; i < n; ++i)
if(n%i == ) return false;
return true;
}
//时间复杂度O(n)
//改进, 去掉偶数的判断
//代码:
bool isPrime(int n)
{
if(n < ) return false;
if(n == ) return true;
if(n % == ) return false;
for(int i = ; i < n; i += )
if(n%i == ) return false;
return true;
}
//时间复杂度O(n/2), 速度提高一倍.
/进一步减少判断的范围
//定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个因子d.
//证明: 如果n不是素数, 则由定义n有一个因子d满足1<d<n.
//如果d大于sqrt(n), 则n/d是满足1<n/d<=sqrt(n)的一个因子.
//代码:
bool isPrime(int n)
{
if(n < ) return false;
if(n == ) return true;
if(n % == ) return false;
for(int i = ; i*i <= n; i += )
if(n%i == ) return false;
return true;
}
//时间复杂度O(sqrt(n)/2), 速度提高O((n-sqrt(n))/2).
- 筛选法
- 显然以上的枚举法,不管如何改进都是不能AC的,所以枚举法肯定是行不通的。
- 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
- 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:
- 3 5 7 9 11 13 15 17 19 21 23 25 27 29
- 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:
- 2 3 5 7 11 13 17 19 23 29
//筛法判断素数 一
#include<cstdio>
#define MAXN 2000001
int a[MAXN],i,j;
int main(){
int m;
//筛选出二百万内的所有素数
for(i = ;i <= ;i++){
if(a[i]==)
//利用数组的下标,将i的倍数全部筛掉
for(j = i + i;j <= ;j += i)
a[j] = ;
}
while(scanf("%d",&m) && m!=){
//从数组中依据下标取出[2,m]内的所有素数
for(i = ;i <= m;i++){
if(a[i] == ){
printf("%d ",i);
}
}
printf("\n");
}
return ;
}
//筛法判断素数 二
#include<cstdio>
#define MAXN 2000001
int a[MAXN],i,j;
int main(){
int m;
while(scanf("%d",&m) == && m!=){
//m有多大,数组用多大
for(i = ;i <= m;i++)
a[i] =i;
//m/2缩小范围
for(i = ;i <= m/;i++){
if(a[i] != ){
for(j=i+i;j <= m;j += i){
//将i的倍数全部筛掉
a[j] = ;
}
}
}
for(i = ;i <= m;i++){
if(a[i] != ) printf("%d\n",a[i]);
}
// printf("\n");
}
return ;
}
- 素数打表法
正在研究..... 先挖个坑。
顺便吐槽NYOJ的服务器。还能再烂么?
【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法的更多相关文章
- nyoj_187_快速查找素数_201312042102
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 ...
- Perl快速查找素数
查找N内的所有素数,首先想到的就是: 对整数N从2开始到sqrt(N),进行整除计算,能整除则计算N+1,然后循环.方法简单,但效率低下.1000,000内的素数个数: #!/usr/bin/perl ...
- NYOJ--187--快速查找素数(筛选法,素数打表)
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N ...
- NYOJ 187
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N&l ...
- nyoj---快速查找素数
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...
- (C/C++学习)11.随机数组的快速查找
说明:利用随机函数生成一个随机数组,然后对数组进行排列,再利用二分查找快速查找一个数. 一.生成随机数组 time_t ts; //等价于long ts; unsigned int num = tim ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
随机推荐
- Xamarin for Visual Studio 3.11.666 Beta版 破解补丁
注意:本版本是 Beta 版 现已推送到稳定频道 前提概要 全新安装请参考 安装 Xamarin for Visual Studio. 最新稳定版请参考 Xamarin for Visual St ...
- 传说中的WCF(3):多个协定
我们知道,WCF服务端是先定义服务协定,其实就是一个接口,然后通过实现接口来定义服务类.那么,有一个问题,如果一个服务类同时实现N个接口(也就是有N个协定)呢?结果会如何? 不必猜,我们还是通过实验来 ...
- UVA 1362 Exploring Pyramids 区间DP
Archaeologists have discovered a new set of hidden caves in one of the Egyptian pyramids. The decryp ...
- linux下修改tomcat的默认目录
1.修改tomcat的默认目录.它的默认目录是webapps/ROOT,对应的conf目录下的server.xml里的内容是: 1.修改tomcat的默认目录.它的默认目录是webapps/ROOT, ...
- CentOS系统安装tomcat
按照以下步骤操作即可wget http://mirrors.noc.im/apache/tomcat/tomcat-9/v9.0.0.M6/bin/apache-tomcat-9.0.0.M6.tar ...
- 机器人学 —— 机器人感知(Kalman Filter)
对于机器人感知任务而言,经常需要预判物体的运动,保证机器人在物体与自身接触之前进行规避.比如无人机与障碍物的碰撞,足球机器人判断足球的位置.预判的前提是对当前状态进行准确的估计,比如足球的速度,障碍物 ...
- 局域网聊天软件(winsocket)
LANChat工作整理 2013/8/22 程序实现功能: 局域网聊天软件,启动即可找到在线设备,并能够进行简单的文字聊天. 其实下面这个框图已经说明了程序的绝大部分功能原理. 核心类的程序框图 我觉 ...
- ubuntu搭建svn、git遇到的问题及解决办法
不错的git笔记博客: http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/articl ...
- Ubuntu 14.04怎样升级到Ubuntu 14.10
Ubuntu 14.04怎样升级到Ubuntu 14.10 Ubuntu 14.10 Utopic Unicorn 将在10月23日正式发布,9月25日最终测试版本已经发布,Ubuntu 14 ...
- SQL SERVER 常用字符类型的区别
长度为 n 个字节的固定长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为 n 个字节.char 在 SQL-92 中的同义词为 character. ...