• 线性筛法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 }

             参考资料:《C语言名题精选百则技巧篇》

             如果你觉得我的文章对你有帮助,请推荐一下,非常感谢!

  • 相关阅读:
    Java菜鸟学习笔记(3)--Java API 文档下载与文档注释的使用
    常用控制台命令大全-Ubuntu篇
    Java菜鸟学习笔记(2)--Ubuntu JDK环境变量配置与常见问题
    Java菜鸟学习笔记(1)--Windows JDK环境变量配置与常见问题
    Java菜鸟学习笔记(x)-《java学习圣经宝典》笔记
    自我管理&时间管理(转)
    方滨兴校长在2013届本科生毕业典礼上的讲话(转)
    static Map的使用
    好的测试网站
    经典css网站
  • 原文地址:https://www.cnblogs.com/NeilHappy/p/2842441.html
Copyright © 2020-2023  润新知