线性筛素数,可以保证每一个数都是被其最小的质因子筛掉的,所以可以保证时间复杂度在O(n)。
算法分析:
算法的关键在于第二个for循环的break语句。此处的break是为了保证任何一个合数都是被它的最小质因子筛掉的,所以能够保证每个数都自会被访问一次,这也就保证了复杂度是线性的。
break处的再解释:
该算法的核心是保证每个数都只被它最小的质因子筛掉(理解这一点非常重要)
我们知道任意一个数a可以作如下分解: a = p 1 t 1 ⋅ p 2 t 2 ⋅ p 3 t 3 ⋯ p n t n a=p_1^{t_1}\cdot p_2^{t_2}\cdot p_3^{t_3}\cdots p_n^{t_n} a=p1t1⋅p2t