Следующая повторяющаяся последовательность определена для множества натуральных чисел:
n → n/2 (n – четное) n → 3n + 1 (n – нечетное)
Используя описанное выше правило и начиная с 13, сгенерируется следующая последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Получившаяся последовательность (начиная с 13 и заканчивая 1) содержит 10 элементов. Хотя это до сих пор и не доказано (проблема Коллатца (Collatz)), предполагается, что все сгенерированные таким образом последовательности оканчиваются на 1.
Какой начальный элемент меньше миллиона генерирует самую длинную последовательность?
Примечание: Следующие за первым элементы последовательности могут быть больше миллиона.
Когда в процессе вычисления встретится число с уже посчитанной длиной цепочки – прерываем расчет и добавляем длину (его цепочки).
Использование массива для хранения длин цепочек и, потому, избегание повторных вычислений одного и того же, сокращает время работы программы на два порядка.
Тернарная операция. Можно заменить на более понятную конструкцию:
if(n%2 == 0)
n = n/2 :
else
n = (3 * n + 1);
Измеряем время работы программы
Для измерения времени работы программы подключаем библиотеку time.h:
#include <time.h>
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Проект Эйлера (14 задача) - ответ и скорость работы программы
В итоге ответ на 14 задачу проекта Эйлера составил 837799, программа считает ответ за 20 миллисекунд.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))