先插一个链接,这是我觉着关于这一方面,写的比较好的博客https://blog.csdn.net/Dinosoft/article/details/5829550,尤其是这个博主关于普通筛法的优化。
插一个知识点:任何合数,都能写成素数的积的形式。比如 6=2*3; 50=2*5*5。
根据上面那个博客,我写两点自己想出来的东西:
- 普通筛法:关于为什么:
当前剩下的最小的数就是质数(素数)
因为,假如a是合数,那么a肯定是可以由比a小的数相乘得到的。既然,比a小的数字的倍数都已经被筛掉了,且a是当前没被遍历(第一重for循环)的最小的数,那a就肯定不是合数了。因为,a没有比它更小的因子。
2.快速筛法:关于第二重循环
原博客中说:只能筛出不大于p1的质数 * i。
那为什么,能保证筛出时不漏掉合数呢?
因为当 i 为合数时,i能拆成好多素数的积的形式。而我们的素数 prime[j] 又是从小开始遍历的,所以恰好可以不漏掉合数,将他们筛出来。
另外,附一点其他的收获:想要证明程序时,可以使用数学归纳法,尤其是循环。就像原博客那样。