_在路上

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

#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

posted on 2012-10-04 20:28  _在路上  阅读(369)  评论(0编辑  收藏  举报