Проект Эйлера - Нахождение делителей Задача 12 - PullRequest
0 голосов
/ 24 апреля 2019

Последовательность номеров треугольников генерируется путем сложения натуральных чисел.Таким образом, число 7-го треугольника будет 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. Первые десять членов будут:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

Перечислим факторы первых семи номеров треугольника:

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

Мы видим, что 28 - это первое число треугольника, имеющее более пяти делителей.

Каково значение первого числа треугольника, имеющего более пятисот делителей?

Я попробовал следующее, у меня есть вопросы по математике задачи.Почему мой подход не работает или слишком медленный?

def triangularNumber(number):
    return number*(number+1)/2


def divisorsList(number):
    divisors = []
    for i in range(1,number+1):
        if(number%i == 0):
            divisors.append(i)
    return divisors

while(True):
    n = 10000
    x = int(triangularNumber(n))
    divisors = divisorsList(x)
    if (len(divisors)>500):
        print(x)
        break
    n += 1

Ответы [ 2 ]

1 голос
/ 24 апреля 2019
  1. Вы можете проверить делители до sqrt (число) и вычислить другой делитель, т. е. если x разделить n, тогда n / x является делителем. Тем не менее, это, вероятно, потребует конец.
  2. Вы можете проверить вопрос https://www.quora.com/What-is-an-efficient-algorithm-to-find-divisors-of-any-number
0 голосов
/ 25 апреля 2019

Я изменил предел в функции divisorsList на квадратный корень из числа и нашел другие делители просто путем деления.Однако значительное улучшение наступило, когда я осознал свою очень глупую ошибку в цикле while.Цикл всегда сбрасывается до 1000, изменяя эту решенную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...