被这道水题困了很长时间,因为思路一直是沿用的求素数的方法,所以运行时间会超时。后来想到很多的数据可以进行处理,把那些确定不是素数的数据删除,把素数有一个数组进行储存。具体来说就是要把3的倍数全部去掉,4的倍数全部去掉,依此类推·······
原题地址:点击打开链接。
代码如下:
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
#define N 2000000
char A[N];
int seive()
{
memset(A,1,sizeof(A));
A[0]=A[1]=0;
int i,j,sq=(int)sqrt(N);
for (i=2;i<=N;i++)
if (A[i])
{
for (j=2*i;j<=N;j+=i)
A[j]=0;
}
}
int main()
{
int n,i;
seive();
while (scanf ( "%d",&n )!=EOF&&n!=0)
{
for (i=2;i<=n;i++)
if (A[i]) printf("%d ",i);
putchar('\n');
}
return 0;
}
我刚开始的错误代码:
#include<stdio.h>
#include<math.h>
#define N 2000000
long long a[6000000];
int main()
{
int i,count=1,flat;
double d;
long long b=N,n,c=3;
a[0]=2;
while(c<=N)
{
d=sqrt(double(c)),flat=1;
for(i=2;i<=d;i++)
{
if(c%i==0){ flat=0;break;}
}
if(flat)
a[count++]=c;
c++;
}
while(1)
{
scanf("%lld",&n);
if(n==0)break;
i=0;
while(1)
{
if(a[i]<=n)
{if(a[i]!=0)printf("%lld ",a[i]);i++;}
else break;
}printf("\n");
}return 0;
}