Проект Эйлера (5 задача) потребует минимального знания математики (класса восьмого). Но при решении лучше воспользоваться алгоритмом Евклида.
Узнать больше в телеграм-канале: ProjectEuler++
2520 – самое маленькое число, которое делится без остатка на все числа от 1 до 10.
Какое самое маленькое число делится нацело на все числа от 1 до 20?
Для решения данной задачи проекта Эйлера понадобится находить наибольший общий делитель чисел. Эффективно это делать с помощью алгоритма Евклида (смотрите выше).
Общий смысл алгоритма легче объяснить на численном примере.
Найдем НОД двух чисел: 645 и 381.
Пара чисел делится друг на друга (всегда большее на меньшее).
Большее из чисел в паре заменяется на полученный остаток от деления
В итоге цикл происходит до тех пор пока, одно из чисел (остаток от деления) не станет равен нулю.
Тип переменной num1 – long long int (максимум плюс-минус девятнадцатизначное число)
То же самое, что
Однако так же можно воспользоваться и рекурсивным алгоритмом Евклида. Потому разберем пример.
Найдем НОД двух чисел: 29 и 9.
Пока один из аргументов функции не будет равным нулю, она будет вызывать сама себя таким образом:
При этом больший из аргументов будет заменяться на остаток от деления пары чисел:
Однако при данной реализации функции необходимо изначально правильно подать аргументы (num2 > num1). В итоге дальше максимальный аргумент выбирается автоматически – постоянной заменой их местами при вызове функции.
Возвращает остаток от деления num2 на num1.
Что может быть проще, чем найти число, которое делится без остатка, к примеру, на 2 и 3?
Однако для составных чисел (т.е. которые можно разложить на множители) не все так просто.
В итоге для нахождения наименьшего общего кратного существует универсальная формула:
Где НОД – наибольший общий делитель (смотрите выше).
Тип переменной num1 – long long int (максимум плюс-минус девятнадцатизначное число)
Используя упомянутые выше функции, в цикле for() ищем НОК следующих пар чисел:
answ = 1.
Для измерения времени работы программы подключаем библиотеку time.h:
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
В итоге ответ на 5 задачу проекта Эйлера составил 232792560, программа работает мгновенно.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
© 2023-2024 | eulerproject.ru