被這道水題困了很長時間,因爲思路一直是沿用的求素數的方法,所以運行時間會超時。後來想到很多的數據可以進行處理,把那些確定不是素數的數據刪除,把素數有一個數組進行儲存。具體來說就是要把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;
}