计算输出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;
-
}
阅读(1866) | 评论(0) | 转发(0) |