Проект Эйлера (4 задача) создает ложное впечатление внешней простотой. Но она хранит в себе довольно интересные возможности оптимизации.
Узнать больше в телеграм-канале: ProjectEuler++
Число-палиндром с обеих сторон (справа налево и слева направо) читается одинаково. Самое большое число-палиндром, полученное умножением двух двузначных чисел – 9009 = 91 × 99.
Найдите самый большой палиндром, полученный умножением двух трехзначных чисел.
Задача Эйлера 4 в своем решении потребует определять, является ли число палиндромом или нет.
Для простоты поясню работу функции (смотрите выше) is_palindrom() на примере .
Допустим, функция принимает в качестве проверяемого числа 123 и сохраняет его в переменной check_num = 123. Также нам понадобится переменная revers_num для хранения обратного числа (revers_num = 0).
Пока check_num не равно нулю, будут выполняться следующие операции:
Сравнение обратного числа revers_num = 321 и изначально заданного для проверки num = 123, вернет false – потому что проверяемое число не палиндром.
Подключаем стандартную библиотеку языка Си для работы с булевым типом данных. Для стандарта C99 булевый тип _Bool, который принимает значения 0 и 1. Данная библиотека позволяет использовать более привычный тип данных bool со значениями false и true.
То же самое, что
То же самое, что
То же самое, что
Если значение переменных revers_num и num равны, то вернет true. Иначе – false
Прерывает текущий цикл:
Для измерения времени работы программы подключаем библиотеку time.h:
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
В итоге программа работает быстро, 4 задача проекта Эйлера решается за 0.0 миллисекунд, ответ составил 906609.
Задача несложная и вполне решается обычным перебором, без всяких оптимизаций. Однако вопрос встал бы во времени ее работы.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
© 2023-2024 | eulerproject.ru