本题也算是老生常谈了,给定一个数,输出小于该数的素数个数。
暴力解法是遍历。
当然,主要想说的是其优化方法。
素数,即仅能被拆分成1与自身二数乘积的数。若有其它的拆解方法,则为合数。
- 考虑拆分成乘积时,总是一个大数乘小数,那么我们并不需要遍历所有,仅需将范围限定在开根号后的范围内。
- 合数总能拆解为两个素数之积(算数基本定理),故反向思考下,可以不用遍历除的方式判定,而是先将2的倍数筛去(必为合数),之后,3未被筛去,说明小于3的所有数都无法整除3,则3为素数,再将3的倍数筛去,如此循环往复,依次筛去剩余数的倍数。该方法也称为埃拉托斯特尼筛法(Sieve of Eratosthenes)。