Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180976
  • 博文数量: 43
  • 博客积分: 611
  • 博客等级: 中士
  • 技术积分: 1053
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 13:37
文章存档

2015年(3)

2013年(23)

2012年(17)

我的朋友

分类: C/C++

2013-01-02 21:07:29

         问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。

         思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且p


  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语言名题精选百则技巧篇》

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

阅读(1122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~