Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 45 задачи (Треугольные, пятиугольные и шестиугольные числа)

Проект Эйлера (45 задача). Задача несложная, однако даже в ней есть возможность что-то упростить и ускорить.

Узнать больше в телеграм-канале: ProjectEuler++

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

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

Треугольные 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.

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

Добро пожаловать на сайт))

Решение (проект Эйлера - 45 задача)

Проект Эйлера (45 задача) - структура данных
Структура данных

Структура данных

В задании приведены формулы, при помощи которых можно вычислить искомые чисел по их порядковому номеру в ряду. Однако если просто выписать, например, треугольные числа:

  • 1, 3, 6, 10, 15

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

  • Так 1-е число (1) отличается от 2-го (3) на шаг равный двум (step = 2).
  • 3 (2-е число) меньше 6 (3-е) уже на 3 (step = 3)
  • Для следующей пары чисел (6 и 10) шаг равен 4 (step = 4).

В итоге мы видим, что шаг равномерно увеличивается на 1 (step += 1).

Такие же закономерности можно увидеть и для других рядов чисел:

  • Пятиугольные: step = 4 (между 1 и 5), step += 3.
  • Шестиугольные: step = 5 (между 1 и 6), step += 4.

В итоге мы видим, что каждое следующее число можно получить из предыдущего. Потому для хранения текущего значения числа (value) и шага для получения следующего (step) и создадим структуру number.

Описание работы программы (Проект Эйлера - 45 задача)

Проект Эйлера (45 задача) - решение
Решение

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

Инициализируем их начальными значениями из задания (value = 40755), т.е. в момент их первого совпадения. При этом их текущий шаг (step) будет находиться как разность между текущим значением (40755) и следующим (вычисляется по формуле из задания).

После чего числа увеличивается функцией nex_num() – о ней ниже. Делаем так, потому что иначе значения value чисел сразу совпадут.

Далее в цикле while() будем увеличивать числа до тех пор, пока не совпадут их значения value.

При этом сначала увеличиваем значение шестиугольного числа, потому что оно имеет максимальный шаг изменения. Потом увеличиваем и два остальных числа, пока не достигнут или не превысят его значение.

Измеряем время работы программы

Для измерения времени работы программы подключаем библиотеку time.h:

  • #include <time.h> 

С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.

* Примечания:

clock_t это тип данных, определенный через typedef. По сути это обычный целочисленный long

(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)

CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000

Функция, которая увеличивает число

Функция, которая увеличивает число
Функция, которая увеличивает число

Очень простая функция. Как видно из комментариев на фото, она:

  • принимает структуру содержащую текущее число;
  • увеличивает значение числа на шаг;
  • увеличивает значение шага.

Ответ и скорость работы программы (проект Эйлера - 45 задача)

Проект Эйлера (45 задача) - ответ
45 задача ответ

В итоге ответ на 45 задачу проекта Эйлера составил 1533776805, программа считает ответ мгновенно. 

По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.

проект Эйлера
Курс "C/C++ для начинающих"

Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))

Есть вопросы, господа?

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

© 2023-2024 | eulerproject.ru