艾氏筛法研究

本文探讨了计算1亿以内的质数的有效方法。通过对比两种不同的算法实现,一种是基于筛法优化的质数查找,另一种是老师提供的更高效的实现方案。文章详细展示了这两种算法的具体代码,并讨论了它们的时间复杂度及效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算输出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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值