快速查找素数
时间限制: 1000ms内存限制:
128000KB 64位整型: Java 类名:
上一题 提交 运行结果 统计 讨论版 下一题
类型:
没有
添加
题目描述
现在给你一个正整数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
来源
NYOJ
刚开始做这道题的时候,就是用的筛选法,但是老是显示的超时,肯定是思想还是不正确,后来又重新写了一遍,ac。
筛法可以用给数组单元置零的方法来实现。具体来说就是:首先开一个数组:a[i],i=1,2,3,…,同时,令所有的数组元素都等于下标 值,即a[i]=i,当i不是素数时,令a[i]=0 。当输出结果时,只要判断a[i]是否等于零即可,如果a[i]=0,则令i=i+1,检查下一个a[i]。
AC:
#include<stdio.h>
#include<math.h>
#define n 2000010
int prime[n]={0};
int main()
{
int N;
int i,j;
for(i=2;i<n;i++)
{
if(i%2==1)
prime[i]=1;
else
prime[i]=0;
}
for(i=3;i<=sqrt(n);i++)
{
if(prime[i])
for(j=i+i;j<n;j+=i)
prime[j]=0;
}
while(scanf("%d",&N),N)
{
printf("2 ");
for(i=0;i<=N;i++)
if(prime[i])
printf("%d ",i);
printf("\n");
}
return 0;
}
超时:
#include<stdio.h>
#define N 2000001
int prime[N]={0};
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int i,j;
for(i=2;i<n;i++)
{
if(prime[i]!=1)
{
for(j=i+i;j<n;j+=i)
prime[j]=1;
}
}
for(i=2;i<=n;i++)
if(prime[i]!=1)
printf("%d ",i);
printf("\n");
}
return 0;
}