Chinaunix首页 | 论坛 | 博客
  • 博客访问: 442853
  • 博文数量: 78
  • 博客积分: 2307
  • 博客等级: 上尉
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-04 00:31
个人简介

IT老鸟,信息安全硕士。

文章分类
文章存档

2017年(2)

2012年(21)

2011年(55)

分类: C/C++

2011-06-20 14:15:06

计算输出1亿以内的质数.当然一上来这个所有的偶数干掉.2直接输出.

这个是我的代码.最后步长330130093  也就是这么多步.

下面的是老师的代码 步长99151769  初步计算速度是我的三倍.姜还是老的辣.

  1. #include"stdio.h"
  2. #include"math.h"
  3. #define N 100000000
  4. bool a[N];
  5. void main()
  6. {
  7.  int i,j=1;
  8.  long ljq=0;
  9.     for(i=1;i<=(N-1)/2;i++)
  10.  {a[2*i+1]=true;}//C语言中布尔数组默认的是false
  11.     for(i=3;i<=int(sqrt(N));i+=2)
  12.  {
  13.  j=int((N-1)/i+1);
  14.  
  15.  while(j>=i)
  16.   {
  17.   if(i*j>N)
  18.    j--;
  19.   a[i*j]=false;
  20.   j--;
  21.   while(false==a[j])
  22.   {j--;ljq++;}
  23.   }
  24.  
  25.  }
  26.  j=3;
  27.  printf("2/t");
  28.  while(j<10000)
  29.  {
  30.   if(true==a[j])
  31.   {printf("%d/t",j);}
  32.   j++;
  33.  }
  34.  printf("/n");
  35.  printf("步长%d/n",ljq);
  36. }
  37. 这个是已知的最优算法.原理还没想
  38. /*素数筛选法之优化算法B*/
  39. # include<stdio.h>
  40. # include<math.h>
  41. # define N 100000000
  42. bool prime[N];
  43. int main()
  44. { int i,j;
  45. long ljq=0;
  46. for(i=0;i<=(N-3)/2;i++)/*减低算法时间复杂度近一半*/
  47. prime[i]=true;
  48. for(i=0;i<=(sqrt(N)-3)/2;i++)/*减低算法时间复杂度近一半*/
  49. {
  50.  if(prime[i]==true)
  51.  for(j=i+i*(2*i+5)+3;j<=(N-3)/2;j=j+2*i+3)
  52.  {prime[j]=false;ljq++;}
  53.  /*减低算法时间复杂度之处,比A减低得还要多*/
  54.  }
  55. printf("%d/t",2); /*2非奇数故未在循环算法之内,但2是素数,故先输出*/
  56. for(i=0;i<5000;i++)
  57. /*输出2*n以内的素数,此处只输出10000以内,耗时在4秒内【由此可见此优化算法比最简单筛选法好】;
  58. 我拿秒表测试过,即使是将一亿内的素数输出,整个过程也就42秒【比优化A中的50秒要快,当N数量级
  59. 更大时,此处的优点将更加凸显,可见它比A算法好】(不将cmd屏幕放在当前位置,42秒,若将其放
  60. 在当前屏幕,看其逐条输出运算结果,就慢些,视我们讲其放置为当前窗口的情况而定!)*/
  61. if(prime[i]==true)
  62. printf("%d/t",2*i+3);
  63. printf("/n");
  64. printf("步长%d",ljq);
  65. return 0;
  66. }

阅读(1866) | 评论(0) | 转发(0) |
0

上一篇:质数表的快速求法

下一篇:被骂了

给主人留下些什么吧!~~