素数筛选
题一:计数素数;
思路:
1.根据题目,要找的小于n的所有素数,并统计他的数量,虽然可以通过for循环从零到n 统计,但是这种方式运算量太大,在数值较低的时候,遍历还算好用,但是当数据过大时,素数之间相隔的数太多了,也就是在这之间有太多不必要的遍历。
2.根据英雄哥的笔记,可以看到采用的解决方案是用空间换时间;根据素数的定义,只有被1和本身所整除的数才能叫素数。那么一个素数的所有的倍数均不为素数,例如 一个素数2,那么在n前的所有偶数,均不是素数,因为他们都是2 的倍数;
3.对于n前的每一个数来说,他们都只有两种状态,是或者不是。那么创建一个最大容量的数组,用来记录n前所有的数的状态;我们先默认每个数都是素数,即
int func03(int n)
{
//用于记录素数的个数;
int count = 0;
// 创建数组;
bool num[5000001];
memset(num, true, sizeof(num));
//排除边缘数 0和1 不是素数;
if (n == 0 || n == 1) return 0;
num[0] = num[1] = false;
//从2开始遍历到n;
for (int i = 2; i <= n; i++)
{
if (num[i])//判断是否是素数;由于默认都是素数所以num[2] 是true;
{
count++;
//将除i外的i的所有倍数均置为假
for (int j = 2; j * i <= n; j++)
{
num[j*i] = false;
}
}
}
return count;
}