问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。
思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且p
- #include <stdio.h>
- #define MAX 1000
- #define null1 0
- #define NEXT(x) x=next[x]
- #define REMOVE(x) { previous[next[x]]=previous[x]; \
- next[previous[x]]=next[x]; \
- }
-
- #define INITIAL(n) { unsigned long i; \
- for(i=2;i<=n;i++) \
- previous[i]=i-1,next[i]=i+1; \
- previous[2]=next[n]=null1; \
- }
-
- int main()
- {
- unsigned long previous[MAX+1]={0};
- unsigned long next[MAX+1]={0};
- unsigned long prime,fact,i,mult;
- unsigned long n;
- unsigned long count=0;
-
- scanf("%lu",&n);
-
- INITIAL(n); //initial the array
-
- for(prime=2;prime*prime<=n;NEXT(prime))
- {
- for(fact=prime;prime*fact<=n;NEXT(fact))
- {
- for(mult=prime*fact;mult<=n;mult*=prime)
- REMOVE(mult);
- }
- }
- for(i=2;i!=null1;NEXT(i))
- printf("%lu ",i),count++;
- printf("\nThe sum of the prime numbers is %lu\n",count);
- }
参考资料:《C语言名题精选百则技巧篇》
如果你觉得我的文章对你有帮助,请顶一下,非常感谢!
阅读(1122) | 评论(0) | 转发(0) |