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

2015年(3)

2013年(23)

2012年(17)

我的朋友

分类: C/C++

2012-12-29 21:40:32

       昨天太忙,没有时间做一个题,先记着,明天来补。

       问题描述很简单,就是求N之内的所有质数并且打印出来。

       思路:求质数有很多方法,我这里用一种比较高效的方法。我一步一步地说明方法。

      1.比如判断一个数num是否为质数,那么就用num去对"i(i从2开始)直到根号num"取模,如果都不能整除就说明num是质数。

      2.但是这样会有很多次多余的计算。从1到N,有很多数是可以直接被2,3整除了,那么,就需要去除掉能被2,3整除的数。在6个数里,6n+1,6n+2,6n+3,6n+4,6n+5,6n+6中,只有6n+1,6n+5需要被测试。

      3.进一步地,将取模的范围缩小为"从1到根号num"范围内的质数。

      代码如下:


点击(此处)折叠或打开

  1. #include <stdio.h>
  2.  #include <math.h>
  3.  
  4.  #define MAX 10000
  5.  #define YES 1
  6.  #define NO 0
  7.  
  8.  //prototype
  9.  int judge(int judge_num);
  10.  
  11.  int prime[MAX]={2,3,5};
  12.  int N=100;
  13.  int count=3;
  14.  
  15.  int main()
  16.  {
  17.      int index=0;
  18.      int num;
  19.      for(index=1;index*6+5<=N;index++) //Just test 6*n+1,6*n+5
  20.      {
  21.          num=6*index+1;
  22.          if(judge(num)==YES)
  23.              prime[count++]=num;
  24.          num=6*index+5;
  25.          if(judge(num)==YES)
  26.              prime[count++]=num;
  27.      }
  28.      for(index=0;index<count;index++)
  29.          printf("%d ",prime[index]);
  30.      printf("\n");
  31.  }
  32.  
  33.  int judge(int judge_num)
  34.  {
  35.      int index=0;
  36.      for(index=0;prime[index]*prime[index]<=judge_num;index++)
  37.      {
  38.          if((judge_num%prime[index])==0)
  39.              return NO;
  40.      }
  41.      return YES;
  42.  }

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

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

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