#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define TRUE 1 #define FALSE 0 //筛选法非优化版本 void CalPrime (int n) { int i, j, k; int * arr; if (n < 2) return ; arr = (int *)malloc(sizeof(int) * (n+1)); memset(arr, TRUE, sizeof(int) * (n+1)); arr[0] = arr[1] = FALSE; //0和1不是素数
k = (int)sqrt((double)n); for (i = 2; i <= k; i++) { if (arr[i]) { for (j = i << 1; j <= n; j += i) arr[j] = FALSE; } } for (i = 2; i <= n; i++) { if (arr[i]) printf("%d\r\n", i); } free(arr); } //筛选法优化版本 void CalPrimeExt (int n) { int i, j, t, k, len; int * arr; if (n <= 2) { if (2 == n) puts("2\r\n"); return ; } len = (n - 1) / 2; arr = (int *)malloc(len * sizeof(int)); //申请一半的数组空间 memset(arr, TRUE, len * sizeof(int)); //长度 下标 奇偶数 // len i n n = 2*i+3, i = (n-3)/2 // 1 0 3,4 // 2 1 5,6 // 3 2 7,8 // 4 3 9,10 // ... ... ... // N N-1 2*N+1 == n
k = (int)sqrt(n); for (i = 0; (j = 2 * i + 3) <= k; i++) { if (arr[i]) { for (t = j << 1; t <= n; t += j) { if (t % 2) arr[(t - 3) >> 1] = FALSE; } } } for (i = 0; i < len; i++) { if (arr[i]) printf("%d\r\n", 2 * i + 3); } free(arr); }
void prime_example (void)
{
int n;
while (1)
{ scanf("%d", &n); getchar(); CalPrimeExt(n); //CalPrime(n); }
}
int main () {
prime_example();
return 0; }
参考:http://blog.csdn.net/liukehua123/article/details/5482854