nyoj---快速查找素数

时间:2023-03-09 05:06:39
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]={,,,,};
int main()
{
int n,i,j,k=;
for(i=;i<=;i++)
{
for(j=;j*j<=i;j++)
{
if(i%j==) break;
}
if(j*j>i) arr[k++]=i;
} while(scanf("%d",&n),n)
{
for(i=;arr[i]<=n&&arr[i]!=;i++)
{
if(i==)
printf("%d",arr[i]);
else
printf(" %d",arr[i]);
}
printf("\n");
}
return ;
}

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

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

模板为:

int prime[];
bool bo[]; int prime_table()
{
int i,j,flag=;
memset(bo,,sizeof bo);
bo[]=bo[]=;
for(i=;i<=;i++)
{
if(!bo[i])
{
for(j=i*i;j<=len;j+=i)
bo[j]=;
}
}
for(i=;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代表不是,0代表是
void prime_table()
{
int i,j,flag=;
for(i=;i*i<=len;i++) //对于在给定的范围内,就是打表的范围内
{
if(!isprime[i])
{
for(j=i*i;j<=len;j+=i)
isprime[j]=;
}
}
for(i=;i<=len;i++)
if(!isprime[i])
prime[flag++]=i; }
int main()
{
int n,i;
prime_table();
while(scanf("%d",&n),n)
{
printf("%d",prime[]);
for(i=;prime[i]<=n&&prime[i]!=;i++)
printf(" %d",prime[i]); printf("\n");
}
return ;
}