埃拉托色尼(Eratosthenes)筛法:求素数。

本文详细解释了埃拉托色尼筛法的工作原理,并提供了C语言代码示例,用于寻找给定范围内(如15以内)的所有素数,通过逐个标记并剔除合数来确定素数。
摘要由CSDN通过智能技术生成

例如我求15以内的素数,那么埃拉托色尼筛法运行的原理是这样的:

n=15;

                 2       3       4      5       6     7     8        9       10       11       12      13       14       15

全部标记   1       1       1      1      1      1     1        1        1         1        1         1         1          1

第一次筛    1       1       0      1      0      1     0        1        0         1        0         1         0          1

第二次筛    1       1       0      1      0      1     0        0        0         1        0         1         0          0

运行完可以发现2到15中剩下被标记为1的都为素数,非素数都被标记为0.所以最后输出标记为1的即可得到n区间内所有素数。可以把例子带入下列代码中配合图解逐步验证方便理解。

#include<stdio.h>//需要引入的文件
#include<math.h> 
//如解答错误,注意检查错误信息提示,对比预期输出和实际输出之间的差异
int main() {
 int a[101];
 int i,j;
 int n=100;
 for(i=1;i<=n;i++)
 {
   a[i]=1; //把n以内所有数都标记为1,如上面的图解,即先假定他们都是素数。
 }
 for(i=2;i<=sqrt(n);i++)//i最多等于sqrt(n),因为范围要在(2,n)内。
 {
   if(a[i] == 1)
   {
    for(j=i;j*i<=n;j++) //j直接令为i是因为j之前的倍数都标记过了,例如i=4时,4的2倍与4的3倍在之前都被标记过了,因为在i=2时,会算到2的4倍,i=3时计算过了3的4倍,所以可以直接从4的4倍开始,接着4的5倍数,,,,
    {
      a[i*j]=0;   //把素数的倍数都标记为0.
    }
   }
 }
 for(i=2;i<=n;i++)
 {
   if(a[i] == 1)  //非素数都被标记为0;剩下的标记为1的就全是素数了。
   {
     printf("%d ",i);
   }
 }
 return 0;
}

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值