今天看到一个蓝桥杯的题目,说要找到第2019个质数,听上去不难,但是他有个限制,让我们在1s算出来,用以往的方法时间明显大于了需求时间。
import time
n = 1
x = 3
while n <= 2019:
for i in range(2, x):
if x % i == 0:
break
else:
n += 1
x += 1
else:
print(x)
print(time.process_time())
>>>17574
1.765625
于是我上网看了很多的方法,发现都是利用这种方法去找质数,没有什么实质的改变。于是我就想了一下,发现我们可以通过修改代码来手动剔除我们可知的一些非质数(比如偶数,这个可以直接在循环数值中剔除),从而提高效率。但是意义不大,因为实际消耗时间的部分内层循环,去找中间可以整除这个数的过程。
import time
n = 1
x = 3
while n <= 2019:
for i in range(3, x):
if x % i == 0:
break
else:
n += 1
x += 2
else:
print(x)
print(time.process_time())
>>>17575
1.78125
同样再次利用上面的思路,我们都已经排除了偶数,那中间去用偶数对其取余是没有意义的事情了,所以我们可以直接跳过偶数。全部用质数来判断。改完之后,此时我们可以发现时间已经来到了1s之内,达到了要求。有时候会超过1s纯属CPU瞬时频率导致的,不影响。
import time
n = 1
x = 3
while n <= 2019:
for i in range(3, x, 2):
if x % i == 0:
break
else:
n += 1
x += 2
else:
print(x)
print(time.process_time())
>>>17575
0.859375
希望这个能对大家有帮助,如有更好的想法,欢迎大家留言评论。