Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.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中的三角形数_Python - Fatal编程技术网

python中的三角形数

python中的三角形数,python,Python,我正在努力解决这个问题: 第一个有500个以上除数的三角形数的值是多少 三角形数是一个数和的序列,即1+2+3+4+5 我很确定这是一个有效的代码,但我不知道,因为我的电脑计算时间太长了。有人知道如何使程序更快一点吗。 谢谢 您没有更新one的值,因此您的程序将永远不会结束。提示: 第n个三角形数的公式是什么 n和n+1没有共同因素(除了1)。问题:给定n和n+1中的因子数量,如何计算n*(n+1)中的因子数量?那么n/2和(n+1)(或者n和(n+1)/2)呢 如果您知道n的所有素数因子,如

我正在努力解决这个问题:

第一个有500个以上除数的三角形数的值是多少

三角形数是一个数和的序列,即1+2+3+4+5

我很确定这是一个有效的代码,但我不知道,因为我的电脑计算时间太长了。有人知道如何使程序更快一点吗。
谢谢


您没有更新
one
的值,因此您的程序将永远不会结束。

提示:

  • 第n个三角形数的公式是什么
  • n
    n+1
    没有共同因素(除了
    1
    )。问题:给定
    n
    n+1
    中的因子数量,如何计算
    n*(n+1)
    中的因子数量?那么
    n/2
    (n+1)
    (或者
    n
    (n+1)/2
    )呢
  • 如果您知道
    n
    的所有素数因子,如何计算
    n
    的除数
如果您不想更改算法,则可以通过以下方式使其更快:

  • l.append
    替换为
    factor_count+=1
  • 枚举到
    int(a**.5)
    而不是
    a/2
    (在这种情况下使用
    因子计数+=2

      你必须多想,少用暴力来解决欧拉计划的问题


      在这种情况下,您应该调查三角形数有哪些除数以及有多少除数。从头开始,寻找模式,试着理解问题。

      为了理智起见,你应该使用

      while True:
      

      并且去掉
      one

      您当前的暴力算法效率太低,无法在1分钟的项目时间限制内解决此问题。相反,我建议看看除数函数:


      首先,那些告诉你用暴力无法在一分钟内解决这个问题的人是错误的。针对这种规模问题的蛮力算法将在几秒钟内运行

      其次,您发布的代码有几个问题,其中一些已经提到

      • 一旦达到目标条件(当前打印一个),应通过将
        one
        设置为
        0
        以外的值来终止循环
      • 您永远不会重新初始化列表(
        l=[]
        )。每次在进入for循环之前重新计算
        a
        b
        ,都应该执行此操作
      • 这个问题要求第一个三角形数的除数必须大于500。如果len(l)>500,您的终止条件应为
      • 您可能不想在for循环中打印一个,而是等待while循环完成
      真正让你慢下来的是,对于每个三角形数
      a
      ,你要检查a/2以内的每个值,看它是否是除数。您只需检查
      a
      的平方根以下的值。这样,对于
      x
      的每个值,如果
      x
      是一个除数,您可以将
      x
      a/x
      添加到列表中

      以下是我在上面概述的修改后的代码:

      import math
      
      def main():
          l = []
          one = 0
          a = 1
          b = 2
          while one == 0:
              a = a + b 
              b += 1
              l = []
      
              sqrt_a = int(math.sqrt(a))
      
              for x in range(1, sqrt_a + 1):
                  if a % x == 0:
                      l.append(x)
                      if x < math.sqrt(a):
                          l.append(a // x)
                      if len(l) > 500:
                          # print(a)
                          one = 1
      
          print(a, b, len(l))
      
      if __name__ == '__main__':
          main()
      
      导入数学
      def main():
      l=[]
      一=0
      a=1
      b=2
      当一=0时:
      a=a+b
      b+=1
      l=[]
      sqrt_a=int(math.sqrt(a))
      对于范围内的x(1,sqrt_a+1):
      如果%x==0:
      l、 附加(x)
      如果x500:
      #印刷品(a)
      一=1
      印刷品(a、b、len(l))
      如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
      main()
      

      您将看到它在大约5或6秒钟内运行,经过这些修改后不到一分钟。

      请不要发布“one==0”计算结果为true的代码。看着它很痛苦:|习惯它:-)这是一个和其他任何东西一样好的比较。在这个程序中,它总是正确的…@Renze de Waal:你不能说
      而1
      或者至少
      而1==1
      ?变量不能被称为
      running
      或其他什么吗?好的,但是为了你自己的理智,请尝试使用一致的缩进:)while True:似乎是正确的做法(我不是Python专家,但我的Python接受它)。我想这是@mark lincoln的成语,意思是
      while True
      。考虑到问题
      ,而True
      在这里是合适的。他只需要在
      打印
      之后添加一个
      中断
      ,修复几个bug,解决方案就会起作用(尽管速度太慢)。我同意-打印后返回会起作用,至少在这一部分。我个人试图远离真实的东西,因为我有一个讨厌的习惯,忘记归还东西:PYou给出了太多的解决方案。但他给出了很好的方向!(与上面的Ghose近乎暴力的解决方案不同)。+1:非常非常有用的提示。特别是除数的素因子——天才。
      import math
      
      def main():
          l = []
          one = 0
          a = 1
          b = 2
          while one == 0:
              a = a + b 
              b += 1
              l = []
      
              sqrt_a = int(math.sqrt(a))
      
              for x in range(1, sqrt_a + 1):
                  if a % x == 0:
                      l.append(x)
                      if x < math.sqrt(a):
                          l.append(a // x)
                      if len(l) > 500:
                          # print(a)
                          one = 1
      
          print(a, b, len(l))
      
      if __name__ == '__main__':
          main()