【问题标题】:What is the value of the first triangle number to have over five hundred divisors第一个有五百多个除数的三角形数的值是多少
【发布时间】:2019-08-25 13:44:10
【问题描述】:

我试图找到具有 500 个除数的三角形数,但我不断收到此错误。如何解决。

    import math
#I make a list of first 300 prime numbers
    def compute():
      z=[]
      prime = [True for i in range(1990)]
      p=2
      while(p*p<=1990):
        if(prime[p]==True):
            for i in range(p*p,1990,p):
                prime[i]= False
        p=p+1

      for p in range(2,1990):
        if (prime[p]==True):
            z.append(p)

      return(z)
#for counting the number of factors. Here is where I face a problem in the code      
    def countfactor(n):
      initial= n
      factor=1

      for i in range(0,n):
          if z1[i]<=math.sqrt(n):
             power=0
             while(initial%z1[i]==0):
                 initial=initial/n
                 power=power+1
             factor=factor*(power+1)


      if initial>1:
          factor=factor*2

      return(factor)
#function for providing triangle number to the countfactor() function      
    def compute1():
        i=1
        while(True):
            triangle=int(i*(i+1)/2)
            factors =countfactor(triangle)
            print(factors)
            if factors>500:
                print(triangle)
                break
            else:
                i=i+1

    if __name__ == "__main__":
        z1=compute()
        compute1()

实际结果应该是 76576500,但我收到错误“列表索引超出范围”。请说明错误以及解决方法。

【问题讨论】:

  • 您好--看起来您已经发布了代码示例和预期/期望的行为。但是,您似乎没有尝试使用调试器来单步执行您的代码以了解它在做什么。请先这样做,因为它既可以解决您的问题,也可以让您提供更多详细信息以帮助他人回答问题。
  • 您需要创建一个minimal reproducible example。至少,添加完整的错误消息。

标签: python python-3.x


【解决方案1】:

我真的很难遵循您的代码。你为什么要寻找素数?

这是我在 Python3 中的解决方案:

import math

# Function that gets rectacle number by number
def get_rectangle_number(i):
  result = (i * (i + 1)) / 2
  return result

# Function that gets all divisors of a numbers
def divisorGenerator(n):
    large_divisors = []
    for i in range(1, int(math.sqrt(n) + 1)):
        if n % i == 0:
            yield i
            if i*i != n:
                large_divisors.append(n / i)
    for divisor in reversed(large_divisors):
        yield divisor

# Init variables
number = 0
rectangle_number = 0
divisors = 0

# While the results has been found, keep searching
while divisors < 500:
  # Loop number
  number += 1

  # Get Rectangle number
  rectangle_number = get_rectangle_number(number)

  # Check count divisors
  divisors = len(list(divisorGenerator(rectangle_number)))

  # Debug
  print('Recatacle number: ', rectangle_number)
  print('Count divisors: ', divisors)

print('Solution:' ,rectangle_number)

Online example

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多