原理很巧妙,也仅仅是把代码的i < n变成了i * i <= n而已,但是优化却是极其高的。可能你会注意到,在上一份代码里面,我定义的n为int类型,而后面一份代码,我却定义成了long long,这是因为在1s内,上一份代码能判断出来的数量级为1e8,而后面一份代码判断出来的数量级却几乎可以达到1e16。而原因仅仅是因为a * b = c的话一旦a是c的约数,那么b也是,如果a不是,那么b也不是。
这里要插播一条诚挚的感谢,昨天的文章里出现了一个巨大的错误,被一个小可爱指出来了,如下:
确实我昨天的代码错了
犯这样的错误让我心痛不已!!!
以后一定痛定思痛,好好学习天天向上!
6倍筛:一个神奇的规律个人觉得这个方法,是一个神奇的发现。
来看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等。
这个规律的正确性我们这里就不证明了,大家有兴趣可以去查查资料,或者等待大佬评论区解答。
好,那么知道这个规律,此时判断质数就可以6个为单元快进,即将前面的方法循环中i 步长加大为6,加快判断速度,原因是,假如要判定的数为n,则n必定是6x-1或6x 1的形式,对于循环中6i-1,6i,6i 1,6i 2,6i 3,6i 4,其中如果n能被6i,6i 2,6i 4整除,则n至少得是一个偶数,但是6x-1或6x 1的形式明显是一个奇数,故不成立;另外,如果n能被6i 3整除,则n至少能被3整除,但是6x能被3整除,故6x-1或6x 1(即n)不可能被3整除,故不成立。
综上,循环中只需要考虑6i-1和6i 1的情况,即循环的步长可以定为6,每次判断循环变量k和k 2的情况即可,理论上讲这种方法整体速度应该会是朴素判断素数法的3倍。代码如下: