【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 ...
随机推荐
- C#中毫米与像素的换算方法
C#中以像素作为尺寸单位,像素是一种相对的尺寸概念,与毫米的转换与当前显示器的分辨率有关.在不同分辨率下转换的系数不同. 借助GDI可以完成毫米至像素的转换. public static double ...
- SSH乱码和Xshell异常断开解决方法
一.SSH Secure Shell Client中文乱码的解决方法 这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要‘UTF-8’编码,我终于知道Wind ...
- SSH开发实践part3:hibernate继承映射
0 大家好.上次讲了关于hibernate中双向1-N的映射配置,可以参考:http://www.cnblogs.com/souvenir/p/3784510.html 实际项目中,对象间的关系比较复 ...
- Linux基础--例行工作
1.仅进行一次的工作排程--at at的工作情况其实是这样的: 1)先找寻/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者则不能使用at(即使没有写在a ...
- JLink and JTAG等接口简介
1.JTAG JTAG用的计算机的并口,JTAG也是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协议,如DSP.FPGA器件等. 标准的J ...
- linux shell 命令学习(3) split - split a file into pieces
split 用来进行文件分割的指令 split [OPTION]... [INPUT [PREFIX]] 发现这个命令是因为有个需求,有个10W行的文本文件,需要分成5个2w行的文本文件, 查了一下资 ...
- C 中变参函数的处理方式
C 函数中变化的参数用‘...’ 表示.变化的参数依旧按照C函数传参的规则入栈,即从右往左依次入栈,保证参数从左往右地址依次升高. 解析变参的主要思想是:将变参缓冲区像容纳了不同类型的数组(当然实际的 ...
- Data Flow ->> Slow Changing Dimension
这里简单讲下SCD 在讲之前贴上两个有用的链接地址.作者的两篇文件讲解了SCD是什么以及应用 http://www.cnblogs.com/biwork/p/3363749.html http://w ...
- Oracle ->> Oracle下查看实际执行计划的方法
也许有很多种方法,这里只是书上学到的一种方法 with a as ( order by grp_factor) t ) select b.id, a.grp_factor )b --use v$sql ...
- kettle的jdk1.7环境变量配置
1).到官网下载需要安装的kettle版本,目前最新版本4.2,官网地址:http://kettle.pentaho.org,我们是使用的版本是kettle3.2 2).本地安装jdk 1.4或以上版 ...