zoukankan      html  css  js  c++  java
  • nyoj---快速查找素数

     

    快速查找素数

    时间限制: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<stdio.h>
    #define maxn 150000
    int arr[maxn]={2,3,5,7,11};
    int main()
    {
        int n,i,j,k=5;
        for(i=13;i<=1999993;i++)
          {
              for(j=2;j*j<=i;j++)
              {
                  if(i%j==0)  break;
              }
              if(j*j>i) arr[k++]=i;
          }
        
        while(scanf("%d",&n),n)
        {
          for(i=0;arr[i]<=n&&arr[i]!=0;i++)
          {
              if(i==0)
            printf("%d",arr[i]);
              else
            printf(" %d",arr[i]);
          }
          printf("
    ");
        }
        return 0;
    }      

    效率不是非常的高.....

    有一种比较快的方法,打表。

    模板为:

    int prime[200000];
    bool bo[10000001];
    
    int  prime_table()
    {
    int i,j,flag=0;
    memset(bo,0,sizeof bo);
    bo[0]=bo[1]=1;
    for(i=2;i<=1000;i++)
    {
    if(!bo[i])
    {
    for(j=i*i;j<=len;j+=i)
    bo[j]=1;
    }
    }
    for(i=0;i<=len;i++)
    if(!bo[i])
    prime[flag++]=i;
    return flag //在该范围内的个数....
    }

    代码:

    #include<stdio.h>
    #define maxn 150000
    #define len 1999993
    int prime[maxn];              //存储素数
    bool isprime[len+1]={1,1};   //用来判断是否为素数,1代表不是,0代表是
    void prime_table()
    {
        int i,j,flag=0;
      for(i=2;i*i<=len;i++)        //对于在给定的范围内,就是打表的范围内
      {
          if(!isprime[i])         
          {
              for(j=i*i;j<=len;j+=i)
                  isprime[j]=1;
          }
      }
      for(i=0;i<=len;i++)
         if(!isprime[i])
            prime[flag++]=i;
      
    }
    int main()
    {
        int n,i;
        prime_table();
        while(scanf("%d",&n),n)
        {
              printf("%d",prime[0]);      
          for(i=1;prime[i]<=n&&prime[i]!=0;i++)
                printf(" %d",prime[i]);
          
          printf("
    ");
        }
        return 0;
    }      
  • 相关阅读:
    闭包的应用(转载)
    智能社讲解js基础
    HTML5 Geolocation
    Redis主从配置
    Redis序列化配置
    Ribbon负载均衡原理学习记录
    2059 mysql
    Cache缓存
    rabbitmq(三)-Direct交换器
    rabbitmq(二)原理
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3248621.html
Copyright © 2011-2022 走看看