题记:
还记得我们最开始如何判断素数吗?暴力求解!但是随着题目数据的不断增大,代码的效率变得异常低,如何优化算法简化程序,就成为了不可避免的问题,埃式筛法便是一种高效的筛选素数的算法,话不多说,上课!!
一,埃式筛选的核心
首先我们要知道素数的倍数一定是合数,那么我们能不能通过把一定范围内的素数的倍数筛去,留下的不就是合数了吗?!思路很简单,但是如何通过代码实现呢?我们接着往下看!!
二,埃式筛法的代码实现
前导:讲之前我们先回忆一下数组的特性,数组就是存放一组相同类型的数据的集合,这个集合中的每一个数据都有对应的下标,下标从0开始。
话不多说,上代码
#include<stdio.h>
int zsb[100000001] = { 0 };//创建一个质数表
//判断质数
int main
{
zsb[0] = zsb[1] = 1; //先把下标0,1标记为合数方便后面操作
int n = sqrt(b);
for (int i = 2; i <= n; i++) //i从2开始取,一个一个判断是不是素数
{
if (zsb[i] == 0) //判断素数
{
for (int j = 2; j <= b / i; j++) //如果i为素数则进入内循环产生i的倍数
zsb[i * j] = 1;
} //把产生的i的倍数标记为合数即赋值1
}
}
程序运行完后zsb数组中下标是素数的都赋值为0了,合数都赋值为1了,要用时直接判断当前下标对应值就可以了。
下课,如有错误欢迎指正,谢谢!!