C++质数相关

1.判断质数

1.单一判断

用作判断次数不多时使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool is_prime(int x)
{
if(x <= 1)
{
return 0;
}
for(int i = 2 ; i * i <= x ; i ++)
{
if(x % i == 0)
{
return 0;
}
}
return 1;
}

解释:我们把一个数拆成 x×yx \times y,发现永远 xx 小于 n\sqrt n,所以只要 nn 不能整除 n\le \sqrt n 的整数,就是一个质数,提高了很多效率。但要注意,n1n \le 1 需单独处理。

2.埃氏筛法

当我们要进行多次判断时,就可能需要用到埃氏筛法。小学数学课讲过,放个图片应该就能理解。

1
2
3
4
5
6
7
8
9
10
11
12
isn_t_prime[0] = isn_t_prime[1] = 1;
for(int i = 2 ; i <= 1e6 ; i ++)
{
if(isn_t_prime[i])
{
continue;
}
for(int j = 2 ; i * j <= 1e6 ; j ++)
{
isn_t_prime[i * j] = 1;
}
}

解释:为了省去初始化数组全部为 11 的时间,00 才代表这是一个质数。碰到一个没达标记的数,就把它的倍数全部打上标记,重复标记是没问题的。但 nn106\le 10^6,不然容易超时,n106n \ge 10^6 时,还是用方法一较为合适。


C++质数相关
http://zhangyimin12345.github.io/posts/cmamfvq5f0005h8369u9i41kc/
作者
zhangyimin12345
发布于
2025年5月6日
更新于
2025年5月6日
许可协议