Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 项目Euler#12-两个代码之间的差异';演出_Python_Loops_Numbers - Fatal编程技术网

Python 项目Euler#12-两个代码之间的差异';演出

Python 项目Euler#12-两个代码之间的差异';演出,python,loops,numbers,Python,Loops,Numbers,我最近开始学习python,为了熟悉这些概念,我开始解决Euler的问题。我一直在尝试解决这个问题,但是我的代码运行了很长一段时间(超过10分钟,仍然在运行)。我在线检查并运行了这段代码,令人惊讶的是它只花了11秒。但我无法理解两者之间的区别。如果有人能帮我理解其中的差异,我将不胜感激 我的代码#1: 最好用算法标签问这个问题 无论如何,不同之处在于函数除数的实现 对于除数(n)此函数在代码中的复杂性是O(n)导致此行的原因: 对于范围(1,n+1)内的i: 但是在第三种码中,除数(n)的复

我最近开始学习python,为了熟悉这些概念,我开始解决Euler的问题。我一直在尝试解决这个问题,但是我的代码运行了很长一段时间(超过10分钟,仍然在运行)。我在线检查并运行了这段代码,令人惊讶的是它只花了11秒。但我无法理解两者之间的区别。如果有人能帮我理解其中的差异,我将不胜感激

我的代码#1:


最好用算法标签问这个问题

无论如何,不同之处在于函数除数的实现

对于除数(n)此函数在代码中的复杂性是O(n)导致此行的原因:

对于范围(1,n+1)内的i:
但是在第三种码中,
除数(n)
的复杂度是O(sqrt(n))

您可以通过编辑除数功能来改进代码


我的提示:1+2+3+…+n=n*(n+1)/2,它不可能是完美的正方形…

你的代码#2在循环中计算
结果
应该在循环之外。那么代码#1呢?天哪,是的!唉,这么愚蠢的错误!谢谢,我会试试你说的。
from time import time
import math

def divisors(n):
    n = int(n)
    sqrt = int(math.sqrt(n))
    result = sum(2 for i in range(1, sqrt+1) if n%i == 0)
    for i in range(1, n+1):
        if i**2 == n:
            result = result - 1
    return result
i = 1
num = 0
a = 0
t = time()
while a < 500:
    num = num+i
    print(num, i)
    i = i+1
    a = divisors(num)
print(a)
tt = time() - t
print(tt)
from time import time
import math

def divisors(n):
    n = int(n)
    sqrt = int(math.sqrt(n))
    for i in range(1, n+1):
        result = sum(2
                     for i in range(1, sqrt+1) if n%i == 0)
        if i**2 == n:
            result = result - 1
    return result

i = 1
num = 0
a = 0
t = time()
while a < 500:
    num = num+i
    print(num, i)
    i = i+1
    a = divisors(num)
print(a)
tt = time() - t
print(tt)
import math
from time import time
t = time()
def divisors(n):
    number_of_factors = 0
    for i in range(1, int(math.ceil(math.sqrt(n)))):
        if n % i == 0:
            number_of_factors +=2
        else:
            continue
    return number_of_factors

x=1
for y in range(2,1000000):
    x += y
    if divisors(x) >= 500:
        print x
        break
tt = time()-t
print tt