线性筛法求质数

个人描述:

这也是一个用空间换时间的方法,速度固然是快,但是你要求多大上限的质数就需要多大上限的数组,这在一定程度上限制的大数的范围。有解决方法?留待以后闲时研究。

应用原理:

因式分解定理: 任何一个非质数都可以分解成质数的连乘积

即:合数 n = pkq (p < q)

因此在删除非质数时,如果已知p是质数,可以先删除p2, p3, p4....,接着找出比p大的而且没有被删除的数q,然后删除pq, p2q, p3q...,一直到pq > n为止。

代码示例:

#include <stdio.h>

#include <stdlib.h>

#define MAX_COUNT 10000

#define NEXT(x) x = next[x]

#define PREV(x) x = prev[x]

#define REMOVE(x) { next[prev[x]] = next[x]; \

                             prev[next[x]] = prev[x];}

#define INIT(n) { unsigned long i; \

                        for(i = 2; i <= n; i++){ \

                             next[i] = i + 1; \

                             prev[i] = i - 1; \

                      } \

                       prev[2] = next[n] = NULL; \

                      }

 

int main(int argc, char** argv)

{

    unsigned long num, count;

    unsigned long prime, factor, multi; 

    unsigned long next[MAX_COUNT + 1];

    unsigned long prev[MAX_COUNT - 1];

   

    printf("%s", "please input the upper num\n");

    scanf("%d", &num);

 

    INIT(num);

   

    for(prime = 2; prime * prime <= num; NEXT(prime))

    {

        for(factor = prime; prime * factor <= num; NEXT(factor))

        {

            for(multi = prime * factor; multi <= num; multi *= prime)

            {

                REMOVE(multi);

            }

        }

    }

    for(prime = 2, count = 0; prime != NULL; NEXT(prime))

    {

         if(count++ % 8 == 0)

         {

              printf("\n");

         }

         printf("%8ld", prime);

     }

     return 0;

}

 

转载于:https://www.cnblogs.com/makor/archive/2012/12/08/2808330.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值