快速查找素数

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
现在给你一个正整数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】快速查找素数—— 枚举法、筛选法、打表法的更多相关文章

  1. nyoj_187_快速查找素数_201312042102

    快速查找素数 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 ...

  2. Perl快速查找素数

    查找N内的所有素数,首先想到的就是: 对整数N从2开始到sqrt(N),进行整除计算,能整除则计算N+1,然后循环.方法简单,但效率低下.1000,000内的素数个数: #!/usr/bin/perl ...

  3. NYOJ--187--快速查找素数(筛选法,素数打表)

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 给出一个正整数数N ...

  4. NYOJ 187

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N&l ...

  5. nyoj---快速查找素数

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 给出一个正整数数N ...

  6. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  7. 算法导论-散列表(Hash Table)-大量数据快速查找算法

    目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...

  8. (C/C++学习)11.随机数组的快速查找

    说明:利用随机函数生成一个随机数组,然后对数组进行排列,再利用二分查找快速查找一个数. 一.生成随机数组 time_t ts; //等价于long ts; unsigned int num = tim ...

  9. (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)

    (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...

随机推荐

  1. (3)初次接触off

    boss布置任务了,要读入off文件,生成能显示出来的可执行文件,完成不了就要滚蛋 目前的东西还是不用保密的,到后面我就要设密码了 好,.off文件是什么? OFF,Object File Forma ...

  2. SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法

    解决方法 出现此问题是因为在安装 Visual Studio 2012(VS2012) 时,会自动安装 "Microsoft SQL Server 2012 Express LocalDB& ...

  3. lintcode:单词切分

    单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 s = "lintcode" dict = ["lint&qu ...

  4. unity Transform Find 的用法!!!

    用法: Transform Find(String name) 1.查找名为name的(transform.gameObject)直接子物体并返回该子物体的Transform属性.不能是孙子物体或更低 ...

  5. Java-马士兵设计模式学习笔记-观察者模式-OOD 线程 改进

    1.概述 由于上一个文章<Java OOD 线程>中的线程是父类主动监听childe,比较耗资源,现改进为childe类醒来后主动联系父类 2.代码 Test.java class Chi ...

  6. Mysql Workbench 学习

    1.安装 http://dev.mysql.com/downloads/tools/workbench/ 选择合适的,下载(以Ubuntu 为例) cd到下载目录,然后sudo dpkg -i wor ...

  7. Combiner

    如果job 设置了 combiner ,则job的每个map运行的数据会先进入combiner,然后再通过patitioner分发到reduce.通过combiner能减少reduce的计算.空间压力 ...

  8. log log4net用代码记录日志

    log4net  用代码记录日志 今天在开发项目的时候,遇到跨域调用log4net中的类,出现了一个bug,提示LogImpl未标记可序列化,此时,我靠,麻烦了,这个类又不是咱们自己的,改源码我想应该 ...

  9. vb.net 写入文件同步锁

    <SoapHeader("oHeader")> _ <WebMethod()> _ <ScriptMethod(ResponseFormat:=Res ...

  10. 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 第一步,现在要安装集成环境xcode5,安装xcode5需要系统至少是os x 10.8.5. 第二步,下载co ...