zoukankan      html  css  js  c++  java
  • NYOJ 187

    快速查找素数

    时间限制: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 #include <iostream>
     2 #include<stdio.h>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int MAXN = 2000000;            
     7 bool u[MAXN];                       
     8 int  prime[MAXN], cnt = 0;          
     9 void primer(){
    10     memset(u, true, sizeof(u));   
    11     for(int i=2; i<MAXN; ++i){
    12         if(u[i]) prime[cnt++] = i;    
    13         for(int j=0; j<cnt && i*prime[j]<MAXN; ++j){
    14             u[i*prime[j]] = false;    
    15             if(0 == i%prime[j]) break; 
    16         }
    17     }
    18 }
    19 //
    20 int getnum(int n){
    21     int left = 0,right = cnt-1;
    22     int middle=(left+right)/2 ;
    23     while(prime[middle]!=n&&right>=left ){
    24         if(n<prime[middle]) right = middle-1;
    25         else left= middle+1;
    26         middle = (left+right)/2;
    27     }    
    28     return middle;
    29 }
    30 
    31 int main(){
    32     int n;    primer();
    33     while(1){
    34         scanf("%d",&n); 
    35         if(n==0) break;
    36         for(int i=0;i<getnum(n )+1;i++ ){
    37             printf("%d ",prime[i] ) ;  
    38         }
    39         printf("
    "); 
    40     }    
    41     return 0;
    42 }

    下面曝一种其他同学的写法:也是筛法,但是比较单一,比较简单,但是却能AC。

     1 #include<stdio.h>
     2 
     3 int main(){
     4     int n,i,s,j;
     5     bool a[2000005]={0};
     6     a[0]=1;a[1]=1;
     7     
     8     //并没有考虑可能重复筛选的数字 
     9     for(i=2;i<2000001;i++){
    10         if(a[i]==0){
    11             for(j=i+i;j<=2000001;j=j+i)
    12                 a[j]=1;
    13         }  
    14     }
    15     
    16     while(scanf("%d",&n)!=EOF&&n!=0){
    17         s=0;
    18         for(i=2;i<=n;i++){
    19             if(a[i]==0){
    20                 s++;
    21                 if(s==1) printf("%d",i);
    22                 if(s>1) printf(" %d",i);
    23             }
    24         }
    25         printf("
    ");
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    ASP.NET使用UEditor入门与常见问题
    关于发布者策略程序集学习记录
    Myeclipse 10安装,以及Flex4插件(原)
    IE、Chrome等浏览器实现PDF预览(原)
    Oracle数据库中文显示乱码的最简单解决办法
    关于程序集的结构(2)C#和.NET2.0实战学习笔记
    关于AppDomain
    关于强名称程序集 C#和.NET2.0实战学习记录
    数据库查询·聚合分支格式化日期·思维导图&要点&误点(含示例)
    如何在SERVER2003上安装MySQL?(附安装教程及资源地址)
  • 原文地址:https://www.cnblogs.com/liugl7/p/5363002.html
Copyright © 2011-2022 走看看