参考可能是求质数最高效的算法_孤岛沉末-CSDN博客_求质数的算法
1、可以进行升级版的试除法
升级版的试除法是用当前数字除以之前的质数,这样需要空间换时间,把之前的素数存储下来然后分别进行除法实验。
2、从2开始到sqrt(n)试除即可。
3、除以sqrt(n)内的质数即可,非质数都是由质数乘出来的
当你在除以非质数的时候,其实可以分解为分别除以非质数的因数,而非质数经过不断的分解,直到分解不了的时候,一个质数可以划分为若干的质数(因为你已经分解不了了嘛)
一个非质数可以视为若干质数的乘积
◇境界1
在试除法中,最最土的做法,就是:
假设要判断 x 是否为质数,就从 2 一直尝试到 x-1。这种做法,其效率应该是最差的。如果这道题目有10分,按照这种方式做出的代码,即便正确无误,俺也只给1分。
◇境界2
稍微聪明一点点的程序猿,会想:x 如果有(除了自身以外的)质因数,那肯定会小于等于 x/2,所以捏,他们就从 2 一直尝试到 x/2 即可。
这一下子就少了一半的工作量哦,但依然是很笨的办法。打分的话,即便代码正确也只有2分
◇境界3
再稍微聪明一点的程序猿,会想了:除了2以外,所有可能的质因数都是奇数。所以,他们就先尝试 2,然后再尝试从 3 开始一直到 x/2 的所有奇数。
这一下子,工作量又少了一半哦。但是,俺不得不说,依然很土。就算代码完全正确也只能得3分。
◇境界4
比前3种程序猿更聪明的,就会发现:其实只要从 2 一直尝试到√x,就可以了。估计有些网友想不通了,为什么只要到√x 即可?
简单解释一下:因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。至于严密的数学证明,用小学数学知识就可以搞定,俺就不啰嗦了。
◇境界5
那么,如果先尝试2,然后再针对 3 到√x 的所有奇数进行试除,是不是就足够优了捏?答案显然是否定的嘛?写到这里,才刚开始热身哦。
一些更加聪明的程序猿,会发现一个问题:尝试从 3 到√x 的所有奇数,还是有些浪费。比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3,5,7,9。但是你发现没有,对9的尝试是多余的。不能被3整除,必然不能被9整除……顺着这个思路走下去,这些程序猿就会发现:其实,只要尝试小于√x 的质数即可。而这些质数,恰好前面已经算出来了(是不是觉得很妙?)。
所以,处于这种境界的程序猿,会把已经算出的质数,先保存起来,然后用于后续的试除,效率就大大提高了。
顺便说一下,这就是算法理论中经常提到的:以空间换时间。