计算输出1亿以内的质数.当然一上来这个所有的偶数干掉.2直接输出.
这个是我的代码.最后步长330130093 也就是这么多步.
下面的是老师的代码 步长99151769 初步计算速度是我的三倍.姜还是老的辣.我的其实还有优化的空间.暂时不去想了.备考去.
#include"stdio.h"
#include"math.h"
#define N 100000000
bool a[N];
void main()
{
int i,j=1;
long ljq=0;
for(i=1;i<=(N-1)/2;i++)
{a[2*i+1]=true;}//C语言中布尔数组默认的是false
for(i=3;i<=int(sqrt(N));i+=2)
{
j=int((N-1)/i+1);
while(j>=i)
{
if(i*j>N)
j--;
a[i*j]=false;
j--;
while(false==a[j])
{j--;ljq++;}
}
}
j=3;
printf("2/t");
while(j<10000)
{
if(true==a[j])
{printf("%d/t",j);}
j++;
}
printf("/n");
printf("步长%d/n",ljq);
}
这个是已知的最优算法.原理还没想
/*素数筛选法之优化算法B*/
# include<stdio.h>
# include<math.h>
# define N 100000000
bool prime[N];
int main()
{ int i,j;
long ljq=0;
for(i=0;i<=(N-3)/2;i++)/*减低算法时间复杂度近一半*/
prime[i]=true;
for(i=0;i<=(sqrt(N)-3)/2;i++)/*减低算法时间复杂度近一半*/
{
if(prime[i]==true)
for(j=i+i*(2*i+5)+3;j<=(N-3)/2;j=j+2*i+3)
{prime[j]=false;ljq++;}
/*减低算法时间复杂度之处,比A减低得还要多*/
}
printf("%d/t",2); /*2非奇数故未在循环算法之内,但2是素数,故先输出*/
for(i=0;i<5000;i++)
/*输出2*n以内的素数,此处只输出10000以内,耗时在4秒内【由此可见此优化算法比最简单筛选法好】;
我拿秒表测试过,即使是将一亿内的素数输出,整个过程也就42秒【比优化A中的50秒要快,当N数量级
更大时,此处的优点将更加凸显,可见它比A算法好】(不将cmd屏幕放在当前位置,42秒,若将其放
在当前屏幕,看其逐条输出运算结果,就慢些,视我们讲其放置为当前窗口的情况而定!)*/
if(prime[i]==true)
printf("%d/t",2*i+3);
printf("/n");
printf("步长%d",ljq);
return 0;
}