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;
}      
原文地址:https://www.cnblogs.com/gongxijun/p/3248621.html