我们来看一个最简单判断素数的方法
我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
int isPrime(int n){
for (int i = 2; i <= sqrt(n); i++)
{
if (i % n == 0)return 0;//不是素数
}
return 1;//是素数
}
看起来挺好的是吧,我们想一想当n特别大的时候,我们需要进行判断的次数也特别多,我们很自然的会想有没有更好的判断的方法,埃氏筛法就是其中一种。
我们先来讲一下埃氏筛法的原理,
先将2到n范围内的所有整数写下来。其中最小的数字2是素数。将表中所有2的倍数都划去。
表中剩余的最小数字是3,它不能被更小的数整除,所以是素数。再将表中所有3的倍数都划去。
依次类推,如果表中剩余的最小数字是m时,m就是素数。然后将表中的所有m的倍数都划去。像这样反复操作,就能依次枚举n以内的素数。
直接上代码(判断1到10万中所有的素数,将素数的倍数全部直接判断为非素数)
bool prime[100001];
void ai() {
for (int i = 2; i <= 100000; ++i) prime[i] = 1;//1是素数
for (int i = 2; i <= 100000; ++i)
if (prime[i])
for (int j = i * 2; j <= 100000; j += i)
prime[j] = 0;//0不是素数
}