zoukankan      html  css  js  c++  java
  • Python练习题 035:Project Euler 007:第10001个素数

    本题来自 Project Euler 第7题:https://projecteuler.net/problem=7

    # Project Euler: Problem 7: 10001st prime
    # By listing the first six prime numbers:
    # 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
    # What is the 10 001st prime number?
    # Answer: 104743
    
    import time
    
    def f(x):  #判断 x 是否为素数,返回bool值
        if x == 2:
            return True
        elif x <= 1:
            return False
        else:
            t = False  #判断是否能够整除
            for i in range(2, x//2):
                if x%i == 0:
                    t = True
                    break
            if t:  #若能整除
                return False
            else:
                return True
    
    startTime = time.clock()  #计时开始
    lst = []  #存放素数的列表
    a = 1  #从数字 1 开始判断
    while len(lst) < 10001:
        if f(a):
            lst.append(a)
        a += 1
    endTime = time.clock()  #计时结束
    
    print('第10001个素数为%s' % lst[-1])
    print('耗时%.2f秒' % (endTime-startTime))  #计算耗时
    

    求解第 10001 个素数。

    上述代码的思路其实挺简单:首先自定义一个函数,用来判断某个数字是否为素数。之后从数字1开始判断,只要是素数,就放进 lst 列表,直到 len(lst) = 10001 为止,此时 lst[-1] 即为所求之数字。

    思路应该没啥问题,但就是太费时间,总共用了将近 1 分钟!看了 Project Euler 论坛里,有人贴出了代码,说只花了 1.34 秒,但我复制过来一试,也是将近 1 分钟的耗时。或许是因为俺的计算机太烂???

    +++++++++++++++++++++++++++++++++++++++

    【2016-10-30 更新】 在判断是否为素数时,我一般是取 range(2, x//2),但看 Project Euler 论坛里有的人是用 range(2, int(x**.5)+1),我试了下,发现基本可以把计算时间压缩到 1 秒钟之内,真是太方便了!更新代码如下:

    # Project Euler: Problem 7: 10001st prime
    # By listing the first six prime numbers:
    # 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
    # What is the 10 001st prime number?
    # Answer: 104743
    
    import time
    
    def f(x):  #判断 x 是否为素数,返回bool值
        if x == 2:
            return True
        elif x <= 1:
            return False
        else:
            t = False  #判断是否能够整除
            for i in range(2, int(x**.5)+1):
                if x%i == 0:
                    t = True
                    break
            if t:  #若能整除
                return False
            else:
                return True
    startTime = time.clock()  #计时开始
    lst = []  #存放素数的列表
    a = 1  #从数字 1 开始判断
    while len(lst) < 10001:
        if f(a):
            lst.append(a)
        a += 1
    print('第10001个素数为%s' % lst[-1])
    endTime = time.clock()  #计时结束
    print('耗时%.2f秒' % (endTime-startTime))  #计算耗时
    

    其实,如果把 lst 的初始化改为 lst = [2],然后在判断是否为素数时,直接从 3 开始判断,且 a+= 2,似乎还能进一步压缩计算时间,但提升空间有限,所以……就不折腾了。

  • 相关阅读:
    MiniOS系统
    《硅谷传奇》
    《构建之法》1—3章
    学术诚信与职业道德
    Sprint2
    Scrum 项目 7.0 Sprint回顾
    Scrum 项目 6.0 sprint演示
    Scrum 项目 5.0
    Scrum 项目4.0
    操作系统 实验三 进程调度模拟程序
  • 原文地址:https://www.cnblogs.com/iderek/p/6009787.html
Copyright © 2011-2022 走看看