Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 28 задачи (Диагонали числовой спирали)

Проект Эйлера (28 задача) предельно проста и понятна и потому служит лишь для отдыха начинающего программиста перед следующими задачами

Узнать больше в телеграм-канале: ProjectEuler++

Условия задачи

Начиная с числа 1 и двигаясь дальше вправо по часовой стрелке, образуется следующая спираль 5 на 5:
Проект Эйлера (28 задача) - задание
Проект Эйлера (28 задача) - задание

Можно убедиться, что сумма чисел в диагоналях равна 101.

Какова сумма чисел в диагоналях спирали 1001 на 1001, образованной таким же способом?

Всегда Вам рады)))

Решение (проект Эйлера - 28 задача)

Суть алгоритма программы - проект Эйлера (28 задача)
Суть алгоритма программы

Суть алгоритма программы

Если выписать числа в диагоналях спирали в ряд, то в итоге становится заметным определенный алгоритм изменения чисел.

В углах каждого уровня спирали (кроме начального) находятся четыре числа. Они отличаются друг от друга на одну и ту же величину – шаг (step – расстояние между углами).

Однако при этом шаг (step) не является неизменным. Сторона спирали (size_helix) увеличивается с каждым уровнем и шаг (расстояние между углами спирали) соответственно тоже.

Алгоритм программы в итоге основан на последовательном вычислении чисел диагоналей спирали на основе этих закономерностей.

Описание работы программы

Проект Эйлера (28 задача) - решение
Проект Эйлера (28 задача) - решение

Сторону спирали (1001), до которой производятся вычисления, запишем через #define. Сделаем так, потому что это позволяет не искать данную величину по всему коду, если в итоге нам понадобится вычислить диагонали спирали других размеров.

На каждом уровне числовой спирали находится по четыре числа, за исключением начального уровня. Потому первое значение (1) сразу занесем в num – текущее число и answ – сумма диагоналей.

После этого складываются числа на каждом уровне спирали (четыре числа расположенные через расстояние step друг от друга). При переходе на следующий уровень изменяется как шаг, так и сторона спирали. Вычисления закончатся, когда в итоге сторона спирали превысит искомую величину.

Измеряем время работы программы

Для измерения времени работы программы подключаем библиотеку time.h:

  • #include <time.h> 

С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.

* Примечания:

clock_t это тип данных, определенный через typedef. По сути это обычный целочисленный long

(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)

CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000

Ответ и скорость работы программы (проект Эйлера - 28 задача)

Проект Эйлера (28 задача) - ответ
28 задача ответ

В итоге ответ на 28 задачу проекта Эйлера составил 669171001, программа считает ответ мгновенно – за 0 миллисекунд. 

По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.

проект Эйлера
Курс "C/C++ для начинающих"

Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))

Есть вопросы, господа?

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

© 2023-2024 | eulerproject.ru