给定一个数N,要求列出所有不大于N的素数

 
     
#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 _在路上 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wangkaichao/archive/2012/10/04/2711722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值