Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 查找第一个除数超过500的三角形数的代码将无法完成运行_Python_Python 3.x_Math - Fatal编程技术网

Python 查找第一个除数超过500的三角形数的代码将无法完成运行

Python 查找第一个除数超过500的三角形数的代码将无法完成运行,python,python-3.x,math,Python,Python 3.x,Math,好的,我正在研究(找到第一个因数超过500的三角形数),我的代码(在Python 3中)如下所示: factors = 0 y=1 def factornum(n): x = 1 f = [] while x <= n: if n%x == 0: f.append(x) x+=1 return len(f) def triangle(n): t = sum(list(range(1,n)))

好的,我正在研究(找到第一个因数超过500的三角形数),我的代码(在Python 3中)如下所示:

factors = 0
y=1

def factornum(n):
    x = 1
    f = []
    while x <= n:
        if n%x == 0:
            f.append(x)
        x+=1
    return len(f)

def triangle(n):
    t = sum(list(range(1,n)))
    return t

while factors<=500:
    factors = factornum(triangle(y))
    y+=1

print(y-1)
因子=0
y=1
def factornum(n):
x=1
f=[]

虽然x据我所知,您的代码可以工作,但计算因子的数量需要很长时间。对于150个因子,运行大约需要20秒,随着因子数量越来越多,时间将急剧增长

减少处理时间的一种方法是减少正在执行的计算数量。如果你分析你的代码,你每次都在计算
n%1
,这是一个不必要的计算,因为你知道每个整数都可以被它自己和一整除。有没有其他方法可以减少计算量?也许要记住,如果一个数字可以被20整除,那么它也可以被2、4、5和10整除


我可以说得更具体一些,但您需要一个指向正确方向的指针。

据我所知,您的代码可以正常工作,但计算因子的数量需要很长时间。对于150个因子,运行大约需要20秒,随着因子数量越来越多,时间将急剧增长

减少处理时间的一种方法是减少正在执行的计算数量。如果你分析你的代码,你每次都在计算
n%1
,这是一个不必要的计算,因为你知道每个整数都可以被它自己和一整除。有没有其他方法可以减少计算量?也许要记住,如果一个数字可以被20整除,那么它也可以被2、4、5和10整除


我可以说得更具体一些,但是你想要一个指向正确方向的指针。

你的算法效率很低

如果您要求的是指针,而不是完整的解决方案,那么主要的指针是:

  • 有一种更有效的方法来计算next。wiki中有一个明确的公式。此外,如果您生成所有数字的序列,则将下一个
    n
    添加到上一个数字会更加有效。(Sidenote
    list
    sum(list(range(1,n)))
    对我来说毫无意义。如果你想使用这种方法,
    sum(xrange(1,n)
    可能会更有效,因为它不需要范围的具体化)

  • 有很多更有效的方法来解决这个问题

  • 有一种更有效的方法来计算因子的数量。它实际上是在Euler之后调用的:参见


  • 一般来说,Euler项目问题(就像许多其他编程竞赛一样)不应该完全靠蛮力来解决。你应该先想出一些公式和/或更有效的算法。

    你的算法效率很低

    如果您要求的是指针,而不是完整的解决方案,那么主要的指针是:

  • 有一种更有效的方法来计算next。wiki中有一个明确的公式。此外,如果您生成所有数字的序列,则将next
    n
    添加到上一个数字上会更有效。(Sidenote
    list
    中的
    sum(list(range(1,n)))
    对我来说毫无意义。如果你想使用这种方法,
    sum(xrange(1,n)
    可能会更有效,因为它不需要范围的具体化)

  • 有很多更有效的方法来解决这个问题

  • 有一种更有效的方法来计算因子的数量。它实际上是在Euler之后调用的:参见


  • 一般来说,Euler项目问题(与许多其他编程竞赛一样)你应该先想出一些公式和/或更有效的算法。

    从代码的外观来看,这并不是最好的方法。例如,一种简单的优化方法是一直到数字的一半。另外,试着想想如何使用素数fa来实现这一点CTOR,这可能是另一种解决方案。祝你好运!

    从外观上看,代码运行良好,但这不是最好的方法。例如,一种简单的优化方法是一直优化到数字的一半。此外,试着想想如何使用素数实现这一点,这可能是另一种解决方案。祝你好运!

    首先,你必须定义一个因子函数:

    from functools import reduce
    
    def factors(n):
        step = 2 if n % 2 else 1
        return set(reduce(list.__add__,
                      ([i, n//i] for i in range(1, int(pow(n,0.5) + 1)) if n % i 
    == 0)))
    
    这将创建一个集合,并将数字n的所有因子放入其中

    第二,使用while循环,直到获得500个因子:

    a = 1
    x = 1
    while len(factors(a)) < 501:
        x += 1
        a += x
    
    a=1
    x=1
    而len(因子(a))<501:
    x+=1
    a+=x
    
    该循环将在len(系数(a))=500时停止。
    简单打印(a),您将得到答案。

    首先您必须定义一个因子函数:

    from functools import reduce
    
    def factors(n):
        step = 2 if n % 2 else 1
        return set(reduce(list.__add__,
                      ([i, n//i] for i in range(1, int(pow(n,0.5) + 1)) if n % i 
    == 0)))
    
    这将创建一个集合,并将数字n的所有因子放入其中

    第二,使用while循环,直到获得500个因子:

    a = 1
    x = 1
    while len(factors(a)) < 501:
        x += 1
        a += x
    
    a=1
    x=1
    而len(因子(a))<501:
    x+=1
    a+=x
    
    该循环将在len(系数(a))=500时停止。
    简单的打印(a),你就会得到你的答案。

    试着在你的while循环中打印y和因子。有一种更好的方法写
    sum(list(range(1,n)))
    (n**2+n)/2
    试着在while循环中打印y和因子。有一种更好的方法写
    sum(list(range(1,n))
    (n**2+n)/2