1 void getPrimeTrd(){ 2 int i,j; 3 for(i = 2; i < MAX; ++i) {
m = (int)sqrt(i); 4 for(j = 2; j <= m; ++j){ 5 if(i % j == 0) { 6 break;
) 7 } 8 if(j > m) { 9 printf("%d ",i);
} 10 } 11 }
1 void getPrimeTrdOpt(){ 2 int i,j,count; 3 int prime[MAXSIZE]; 4 prime[0] = 2; 5 prime[1] = 3; 6 count = 2; 7 for(i=5; i<MAXNUM; i+=2){ 8 if(i%3){ 9 for(j=0; prime[j]<=(int)sqrt(i); ++j){ 10 if(i%prime[j] == 0) 11 break; 12 } 13 if(prime[j] > (int)sqrt(i)) 14 prime[count++] = i; 15 } 16 } 17 for(i=0; i<count; ++i) 18 printf("%d ",prime[i]); 19 }
1 void getPrimeTrdOpt2(){ 2 int prime[MAXSIZE]; 3 int gap = 2; 4 int count = 3; 5 int may_be_prime = 5; 6 int i; 7 prime[0] = 2; 8 prime[1] = 3; 9 prime[2] = 5; 10 while (prime[count] < MAXNUM) { 11 may_be_prime += gap; 12 gap = 6 - gap; 13 for (i = 2; prime[i]*prime[i] <= may_be_prime; i++) 14 if (may_be_prime % prime[i] == 0) 15 break; 16 if (prime[i] > (int)sqrt(may_be_prime)) 17 prime[count++] = may_be_prime; 18 } 19 for (i = 0; i < count; i++) { 20 printf("%d ", prime[i]); 21 } 22 }
1 void getPrimeErato(){ 2 int prime[MAXSIZE]; 3 int i,j; 4 for(i=0; i<MAXSIZE; ++i){ 5 if(i!=2 && i%2==0) 6 prime[i] = NO; 7 else 8 prime[i] = YES; 9 } 10 for(i=3; i<=(int)sqrt(MAXSIZE); i+=2){ 11 if(prime[i]){ 12 for(j=i+i; j<MAXSIZE; j+=i){ 13 prime[j] = NO; 14 } 15 } 16 } 17 for(i=2; i<MAXSIZE; ++i){ 18 if(prime[i]) 19 printf("%d ",i); 20 } 21 }
1 void getPrimeErato2(){ 2 int prime[MAXSIZE]; 3 int i,j; 4 for(i=0; i<MAXSIZE; ++i){ 5 if(i!=2 && i%2==0) 6 prime[i] = NO; 7 else 8 prime[i] = YES; 9 } 10 for(i=3; i<=(int)sqrt(MAXSIZE); i+=2){ 11 if(prime[i]){ 12 for(j=2; j<=MAXSIZE/i; ++j) 13 prime[i*j] = NO; 14 } 15 } 16 17 for(i=2; i<MAXSIZE; ++i){ 18 if(prime[i]) 19 printf("%d ",i); 20 } 21 }
1 void getPrimeEratoOpt(){ 2 int size = (MAXNUM - 3) / 2 + 1; 3 int prime[size]; 4 int key; 5 int i,j; 6 for(i=0; i<size; ++i){ 7 prime[i] = YES; 8 } 9 for(i=0; i<size; ++i){ 10 if(prime[i]){ 11 key = i + i +3; 12 for(j=key+2*i*i+4*i; j<size; j+=key){ 13 prime[j] = NO; 14 } 15 } 16 } 17 printf("%d ",2); 18 for(i=0; i<size; ++i){ 19 if(prime[i]) 20 printf("%d ",2*i+3); 21 } 22 }
版本四(优化):
1 void getPrimeEratoOpt2(){ 2 int i,j; 3 int size = (MAXNUM-1)/2+1; 4 int prime[size]; 5 for(i=0; i<size; ++i){ 6 prime[i] = YES; 7 } 8 for (i=3;i<size;i+=2) 9 { 10 if(prime[(i-1)/2]){ 11 for (j=i*i;j<MAXNUM;j+=i<<1) 12 prime[(j-1)/2] = NO; 13 } 14 } 15 printf("%d ", 2); 16 for (i=1;i<size;++i) 17 { 18 if (prime[i]) 19 printf("%d ", (i<<1)+1); 20 } 21 }
1 void getPrimeEratoLine(){ 2 int prime[MAXSIZE]; 3 int is_prime[MAXNUM]; 4 int count,i,j; 5 count = 0; 6 for(i=0; i<MAXNUM; ++i){ 7 is_prime[i] = 0; 8 } 9 for(i=2; i<MAXNUM ; ++i){ 10 if(is_prime[i] == 0){ 11 prime[count++] = i; 12 } 13 for(j=0; j<count && (i*prime[j]) < MAXNUM; ++j){ 14 is_prime[i*prime[j]] = 1; 15 if(i % prime[j] == 0) break; 16 } 17 } 18 for(i=0; i<count; ++i){ 19 printf("%d ",prime[i]); 20 } 21 }