试除法判定素数
1 | bool is_prime(int x) { |
朴素筛法求素数
合数有被重复筛除的情况
1 | int primes[N], cnt; //primes[]存储所有素数 |
线性筛法求素数
原理:用一个合数的最小质因子来筛掉这个合数,合数只被筛一次
1 | int primes[N], cnt; //primes[]存储所有素数 |
我们来看break语句:
当i % primes[j] == 0
时,如果没有break,则会开始筛除i * primes[j + 1]
,取i / primes[j]值为x,那么,这个式子可以等价为x * primes[j] * primes[j + 1]
,显然可以看出**primes[j]**才是最小质因子,这次的筛除不成立。
看一个具体的例子:
取n = 15
i 的取值 | primes[j] == 2 | primes[j] == 3 |
---|---|---|
i = 2 | 2 * 2 | |
i = 3 | 3 * 2 | 3 * 3 |
i = 4 | 4 * 2 | |
i = 5 | 5 * 2 | 5 * 3 |
i = 6 | 6 * 2 | |
i = 7 | 7 * 2 |
以i = 4为例,4 * 2被筛除,下一个为4 * 3,显然可以分解为6 * 2,2为最小质因子,所以不能在这里被筛除