质数算法(提高查找质数的速度)

        今天看到一个蓝桥杯的题目,说要找到第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

希望这个能对大家有帮助,如有更好的想法,欢迎大家留言评论。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值