筛质数
线性筛质数
例子:30和45的最大公因数是15
设30为a, 15为b, 2为c
那c肯定会小于b, 因为b是最大公因数, 如果大于b, 那他(c)就是最大公因数, 所以不可能
c是质数, 因为假如c是质数, 那肯定可以分离个质数给b, 这样b就不是最大公因数了
所以, 是不是我们把(小于b的质数全部去乘以1~n)的数全部给标记了, 就可以了?
不是, 假如c大于b的最小质因数, 那30的最大公因数就不是b了
因为b是由若干个质数组成, 如果c大于b的最小质因数, 那b可以是会把自己最小的质因数和c换
所以, 当我们在遍历质数数组时, 它最多就是等于b的最小质因数
还有一个, 我们把从2开始的看作因数, 找他的质数, 第一层循环, 相当于从前往后去遍历一下所有的因数
第二层循环, 相当于把第一层循环中的i的后面的合数进行了标记, 并且根据质数不大于b的最小公因数, 去找后面的合数
如果质数与b的最小公因数相等, 那直接break
代码如下
1 | #include<cstdio> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zhx-CN!
