快速查找素数
时间限制: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
AC
#include <stdio.h>
#include<string.h>
#define M 2000000 //数字过大,进行宏定义
int a[M+5];
int main()
{
int N,i,j;
for(i=2;i<=M;i++)
{
a[i]=0;
}
for(i=2;i<=M;i++)
{
if(!a[i])
{
for(j=i+i;j<=M;j+=i)
{
a[j]=1;
}
}
}//先将2000000以内的素数存起来,在后面直接用到
while(scanf("%d",&N)!=EOF,N)
{
for(i=2;i<=N;i++)
{
if(!a[i])//if(a[i]==0)
{
printf("%d ",i);
}
}
printf("\n");
}
return 0;
}
最开始用的一种方法一直没有AC,显示超时,但是方法是对的
#include <stdio.h>
int main()
{
int N,i,j;
do//筛法
{
scanf("%d",&N);
int a[N];
for(i=0;i<=N;i++)//要等号,因为N也包含在内
{
a[i]=0;
}
if(N==0)
break;
else
{
for(i=2;i*i<=N;i++)//for(i=2;i<=N;i++)
{
if(a[i]==0)
{
for(j=i*i;j<=N;j=j+i)//for(j=i+i;j<=N;j+=i)
{
a[j]=1;
}
}
}
for(i=2;i<=N;i++)
{
if(a[i]==0)
{
printf("%d ",i);
}
}
printf("\n");
}
}while(N!=0);
return 0;
}
函数:
#include<stdio.h>
#include<string.h>
int a[2000005];
void fun()
{
int i,j;
for(i=2;i<2000005;i++)
{
if(!a[i])
{
for(j=i+i;j<2000005;j+=i)
a[j]=1;
}
}
}
int main()
{
int n;
fun();
while(scanf("%d",&n)!=EOF,n)
{
int i;
for(i=2;i<=n;i++)
{
if(!a[i])
printf("%d ",i);
}
printf("\n");
}
}