Проект Эйлера (23 задача) решается довольно быстро, если не вычислять одно и то же повторно, а сохранить промежуточные результаты в массив.
Узнать больше в телеграм-канале: ProjectEuler++
Совершенным числом называется число, у которого сумма его делителей равна самому числу. Например, сумма делителей числа 28 равна 1 + 2 + 4 + 7 + 14 = 28, что означает, что число 28 является совершенным числом.
Число n называется недостаточным, если сумма его делителей меньше n, и называется избыточным, если сумма его делителей больше n.
Так как число 12 является наименьшим избыточным числом (1 + 2 + 3 + 4 + 6 = 16), наименьшее число, которое может быть записано как сумма двух избыточных чисел, равно 24. Используя математический анализ, можно показать, что все целые числа больше 28123 могут быть записаны как сумма двух избыточных чисел. Эта граница не может быть уменьшена дальнейшим анализом, даже несмотря на то, что наибольшее число, которое не может быть записано как сумма двух избыточных чисел, меньше этой границы.
Найдите сумму всех положительных чисел, которые не могут быть записаны как сумма двух избыточных чисел.
Для проверки каждого числа на соответствие условиям задачи нам понадобится проверять пары чисел вплоть до него самого. Потому к каждому числу мы будем обращаться многократно. Это в итоге приведет к многократным повторным проверкам чисел на то, являются ли они избыточными. Потому лучше вычислить их состояние один раз и сохранить.
Для этого воспользуемся массивом, индексом которого будет являться число, а значением – признак “избыточное” / “неизбыточное”:
В итоге задача решается буквально в два действия:
Описание работы самих функций ниже по тексту.
Для измерения времени работы программы подключаем библиотеку time.h:
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Многократно обсужденная функция для поиска делителей числа. Однако повторю ее основные особенности:
Функция следует прямо заданию:
В задании указано, что все целые числа больше 28123 могут быть записаны как сумма двух избыточных чисел. Потому, если число является большим, функция сразу вернет true.
Такие числа в задаче мы использовать не будем, однако функцию захотелось сделать максимально полной.
В функции перебираются числа num, вплоть до проверяемого числа number.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
© 2023-2024 | eulerproject.ru