396 подписчиков

Решение 12 задачи проекта Эйлера: Треугольное число с большим количеством делителей

127 прочитали

Добился вычисления результата за 2 секунды, как еще ускорить - не знаю.

Условия задачи

Последовательность треугольных чисел образуется путем сложения натуральных чисел. К примеру, 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 - первое треугольное число, у которого более пяти делителей.
Каково первое треугольное число, у которого более пятисот делителей?

Описание работы программы

Программа для решения задачи Эйлера #12
Программа для решения задачи Эйлера #12

Алгоритм сделал без особых изысков.

triple_number += i;

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

Вычисляем количество делителей текущего числа, если их больше 500, то ответ получен.

Из особенностей - при подсчете количества делителей треугольное число не делится на весь ряд чисел от единицы до него самого, а лишь до корня квадратного из числа.

for (int j = 1; j < sqrt(triple_number) + 1; j++)

Писал об этом ранее.

Также каждый количество делителей увеличивается стразу на два

if (triple_number % j == 0)
cnt += 2;

Поясню это так. Поскольку для числа А = а*а мы проверяем на то, являются ли числа делителями, только до числа а, то если число b является делителем числа A (A%b = 0), число A раскладывается на два множителя: A=b*c (b < a, c > a). Таким образом при нахождении меньшего множителя, одновременно находится и больший множитель, и следовательно, количество найденных делителей увеличиваем сразу на два.

Ответ на задачу:

Время работы программы: около 2 секунд. Это явно быстрее, чем если считать делители числа простым перебором, но уверен кто-нибудь сможет быстрее)

P.S. Изначальная цель блога - получить "фидбек" в комментариях, чтобы более опытные "кодеры" указывали мне на ошибки, советовали и всячески помогали в саморазвитии.

Также приглашаю всех на мой сайт)

На нем Вы можете посмотреть ответ на задачу Эйлера #12 (когда необходима лишь небольшая подсказка) и последний, самый быстрый вариант решения.

Не забудьте подписаться на канал)
Не забудьте подписаться на канал)

В общем, добро пожаловать на канал))