Найти тему
ZDG

Проект Эйлер 45: Треугольные, пятиугольные и шестиугольные

Оглавление

Задача

Треугольные, пятиугольные и шестиугольные числа вычисляются по нижеследующим формулам:

Треугольные Tn=n(n+1)/2 : 1, 3, 6, 10, 15, ...

Пятиугольные Pn=n(3n−1)/2 : 1, 5, 12, 22, 35, ...

Шестиугольные Hn=n(2n−1) : 1, 6, 15, 28, 45, ...

Можно убедиться в том, что T285 = P165 = H143 = 40755.

Найдите следующее треугольное число, являющееся также пятиугольным и шестиугольным.

Решение

Начиная с числа 40755, находить следующие шестиугольные числа (у них самый быстрый рост) и заодно проверять, являются ли они треугольными и пятиугольными.

Для проверки естественно использовать метод квадратных уравнений из предыдущих задач. Но я сразу потерпел неудачу. Это метод работал очень медленно. Поэтому я пошёл другим путём.

Следующее шестиугольное число можно вычислять не по формуле, а просто прибавляя к текущему шаг, который для 143-го числа равен 143 * 4 + 1 и каждый раз вырастает на 4.

Аналогично шаг для 165-го пятиугольного числа числа равен 165 * 3 + 1 и каждый раз вырастает на 3.

Наконец, шаг для 285-го треугольного числа равен 285 + 1 и каждый раз вырастает на 1.

Я начинаю с трёх чисел, равных 40755, и у каждого есть свой текущий шаг. Сначала прибавляю свой шаг к шестиугольному числу. Затем прибавляю свой шаг к пятиугольному числу, пока оно меньше шестиугольного. И также прибавляю свой шаг к треугольному числу, пока оно меньше шестиугольного.

Если все три числа оказались равны, это ответ.

Работает быстро, но я заметил одну особенность. Например, можно исключить из решения действия с треугольными числами, и ответ всё равно будет правильный.

Если присмотреться, то можно заметить, что шестиугольное число как бы в 2 раза "мощнее", чем треугольное. 143-е шестиугольное число это 285-е треугольное, номера отличаются почти ровно в 2 раза, их шаги на этом этапе тоже отличаются почти ровно в 2 раза: 573 и 286. Разница и там и там всего лишь в единицу.

Так что есть у меня подозрение, что здесь вместо последовательных приращений можно просто найти некий общий делитель этих приращений и плясать от него. Но придумать не могу.

Ссылка на онлайн-компилятор языка C с текстом программы

Подборка всех задач:

Проект Эйлер | ZDG | Дзен