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 }
  • 相关阅读:
    课程作业四 生成随机数并求和,大数运算
    课程作业三 string,char操作
    课程作业二 类内静态内容(代码块,静态变量),构造函数,非静态代码块执行顺序
    十一作业 java数值范围方面训练
    课程作业一 将字符串型数组里的数字相加
    NABCD需求分析
    人月神话阅读笔记01
    软件工程第五周总结
    清明第三天
    清明第二天安排
  • 原文地址:https://www.cnblogs.com/liugl7/p/5363002.html
Copyright © 2011-2022 走看看