【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 ...
随机推荐
- (1)opengl-nehe 4种框架
http://www.yakergong.net/nehe/ 这个网站还是opengl方面比较权威的,作者叫nehe 这东西估计是要先装个ndk,然后才能运行代码 先睡觉! 以下内容参考自http:/ ...
- C 和C++ 名称修饰规则
C名称修饰规则 1.对于使用__cdecl调用约定的函数,在函数名称前加一下划线,不考虑参数和返回值. 2.对于使用__fastcall调用约定的函数,在函数名称前后各加一@符号,后跟参数的长度,不考 ...
- (转载) .NET2.0程序集无法在.net 4.0 中运行的解决方案
首先在MSDN上看到 4.0 的更新日志中有如下这条: .NET Framework 4 不能自动使用自己的公共语言运行时版本来运行由 .NET Framework 早期版本生成的应用程序. 若要使用 ...
- 李洪强iOS开发之OC[009] -OC无参方法的声明实现和调用
- 内存分析_.Net内存原理介绍
内存原理介绍 1. .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...
- 窗口截图(可指定HWND窗口句柄)(三篇文章)
BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) { HWND hDesktop = ::GetDesktopWindow(); ASSERT(h ...
- swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面
搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...
- POJ1019——Number Sequence(大数处理)
Number Sequence DescriptionA single positive integer i is given. Write a program to find the digit l ...
- python多线程threading
本文通过 4个example 介绍python中多线程package —— threading的常用用法, 包括调用多线程, 同步队列类Queue, Ctrl+c结束多线程. example1. 调用 ...
- Backbone seajs
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...