Задача
Треугольные, пятиугольные и шестиугольные числа вычисляются по нижеследующим формулам:
Треугольные 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 с текстом программы
Подборка всех задач: