В задании приведены формулы, при помощи которых можно вычислить искомые чисел по их порядковому номеру в ряду. Однако если просто выписать, например, треугольные числа:
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 задача)
Создадим три структуры number для хранения текущего состояния треугольного, пятиугольного и шестиугольного чисел. В программе будем постепенно увеличивать значения всех трех чисел до тех пор, пока они не совпадут.
Инициализируем их начальными значениями из задания (value = 40755), т.е. в момент их первого совпадения. При этом их текущий шаг (step) будет находиться как разность между текущим значением (40755) и следующим (вычисляется по формуле из задания).
После чего числа увеличивается функцией nex_num() – о ней ниже. Делаем так, потому что иначе значения value чисел сразу совпадут.
Далее в цикле while() будем увеличивать числа до тех пор, пока не совпадут их значения value.
При этом сначала увеличиваем значение шестиугольного числа, потому что оно имеет максимальный шаг изменения. Потом увеличиваем и два остальных числа, пока не достигнут или не превысят его значение.
Измеряем время работы программы
Для измерения времени работы программы подключаем библиотеку time.h:
#include <time.h>
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Функция, которая увеличивает число
Очень простая функция. Как видно из комментариев на фото, она:
Ответ и скорость работы программы (проект Эйлера - 45 задача)
В итоге ответ на 45 задачу проекта Эйлера составил 1533776805, программа считает ответ мгновенно.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))