埃拉托色尼筛选法 算法基础

埃拉托色尼算法是用来产生一个不大于给定整数n的连续质数序列。

算法介绍:算法一开始初始化一个从2到n的连续整数序列,作为算法的候选质数。在算法的第一个循环中,将类似于4,6这样的2的倍数消掉。然后在将序列中下一个质数消去(3的倍数。。)。但是我们可以发现,序列中的某些数被消去了不止一次,比如8这个数字,他同时是2和4的倍数,所以只在2时消去一次就可以。

举个例子,用这个算法找出n不大于25的质数序列

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

2 3    5    7    9      11      13      15      17      19      21      23      25

2 3    5    7            11      13                17      19                23      25

2 3    5    7            11      13                17      19                23


这样子就可以找到这个质数序列,可以发现,在这个例子中,更多的步骤都是多余的。所以这时候应该思考一个问题,消去的最大数应该满足什么条件呢,如果我们正在消去的数是p,那么首先值得考虑的数就是p*p,因为(p-1)*p在之前的步骤中已经消去了,显然p*p不应该大于n,所以p应该满足的条件应该根号n向下取整。

程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()

int * a = new int [25];  //申请一个整形变量空间 ,并定义一个整形指针指向该空间地址 
for ( int i = 0; i < 25; i++) {
a[i]=i;
}
for(int i = 2; i < sqrt(double(25)); i++){
for(int j = i + 1; j < 25; j++){
if(a[j] != 0 && a[j] % i == 0)
a[j] = 0;
}
}
for(int i = 2; i < 25; i++)
{
if(a[i] != 0)
printf("%d ",a[i]);
}
//printf("%d ",a[0]);
}
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值