线性筛法--------2013年1月2日

简介:
   问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。
         思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且p<q)。所以,需要去除的数就变成了p的2次方,p的3次方,p的4次方......以及p的i次方乘以q,i=1,2,3.......p和q的取值是从小到大的没有被去除的数,所以很容易就可以写出如下的程序。
 1 #include <stdio.h>
 2 #define MAX 1000
 3 #define null1 0
 4 #define NEXT(x)  x=next[x]
 5 #define REMOVE(x) {   previous[next[x]]=previous[x];   \
 6                       next[previous[x]]=next[x];       \
 7                   }
 8 
 9 #define INITIAL(n)  { unsigned long i;                    \
10                       for(i=2;i<=n;i++)                   \
11                           previous[i]=i-1,next[i]=i+1;    \
12                       previous[2]=next[n]=null1;           \
13                     }
14 
15 int main()
16 {
17     unsigned long previous[MAX+1]={0};
18     unsigned long next[MAX+1]={0};
19     unsigned long prime,fact,i,mult;
20     unsigned long n;
21     unsigned long count=0;
22     
23     scanf("%lu",&n);
24 
25     INITIAL(n); //initial the array
26 
27     for(prime=2;prime*prime<=n;NEXT(prime))
28     {
29         for(fact=prime;prime*fact<=n;NEXT(fact)) 
30         {
31             for(mult=prime*fact;mult<=n;mult*=prime) 
32                 REMOVE(mult);
33         }
34     }
35     for(i=2;i!=null1;NEXT(i))
36         printf("%lu ",i),count++;
37     printf("\nThe sum of the prime numbers is %lu\n",count);
38 }

 
相关文章
|
算法
26.【算法五章-----02】
26.【算法五章-----02】
56 0
|
敏捷开发 监控 测试技术
软件工程学习-----笔记 2022-1-4------------2022-1-14
软件工程学习-----笔记 2022-1-4------------2022-1-14
91 0
|
算法 C++
22.【算法五章-----01】
22.【算法五章-----01】
44 0
|
小程序 前端开发 程序员
小程序----网络数据请求
小程序----网络数据请求
|
SQL 关系型数据库 MySQL
MySQL数据库第九课--------join连接四件套------不错的哦哦哦
MySQL数据库第九课--------join连接四件套------不错的哦哦哦
|
弹性计算 Linux 云计算
初识-----深入了解
我是物联网工程专业的一次课程安排让我喜欢喜欢上了Linux
147 0
|
数据安全/隐私保护
|
数据安全/隐私保护 网络虚拟化 存储
|
算法 数据安全/隐私保护
|
安全 数据安全/隐私保护