397 подписчиков

Решение 11 задачи проекта Эйлера: Наибольшее произведение в таблице

Задача простая, из интересного - преобразование чисел из строки в массив чисел.

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

В таблице 20×20 (внизу) четыре числа на одной диагонали выделены красным.

Задача Эйлера #11 (условия)
Задача Эйлера #11 (условия)

Произведение этих чисел 26 × 63 × 78 × 14 = 1788696.

Каково наибольшее произведение четырех подряд идущих чисел в таблице 20×20, расположенных в любом направлении (вверх, вниз, вправо, влево или по диагонали)?

Преобразовываю таблицу в удобный формат

Для удобства работы преобразую числа в двумерный массив. Для этого сделаю несколько преобразований.

Преобразовываю число в строку

Преобразовываю таблицу в строку (задача Эйлера #11)
Преобразовываю таблицу в строку (задача Эйлера #11)

Алгоритм действий такой же как в задаче Эйлера #8.

Объявляю строку:

num_str[] = {""};

Скопировал внутрь кавычек цифры из задания.

Проверил себя, все ли цифры занесены в строку:

int str_len = strlen(num_str);

С помощью функции strlen() измерил длину строки ((2-значное число + пробел между числами) * 20 чисел * 20 строк = 1200).

Преобразовываю строку в двумерный массив

В этот раз для преобразования символов в цифры не стал пользоваться функцией atoi() как в прошлый раз, а воспользовался советом товарища и сделал проще.

Заносим числа в двумерный массив (задача Эйлера #11)
Заносим числа в двумерный массив (задача Эйлера #11)

Идея в том, что каждый символ имеет свой код и хранится в виде числа. Так, например, '0' имеет код 48, '1' - 49... и так далее. Необходимо просто вычесть 48 из кода символа числа и получится искомое число.

num = (num_str[indx] - 48)*10;
num += num_str[++indx] - 48;

Ищу наибольшее произведение четырех последовательных цифр

Ищу наибольшее произведение четырех последовательных цифр (задача Эйлера #11)
Ищу наибольшее произведение четырех последовательных цифр (задача Эйлера #11)

В цикле перебираются цифры из массива и перемножаются на три последующих в ряду. Направление ряда чисел задается их координатами в массиве. Надеюсь, из кода все понятно.

Ответ на задачу:

Время работы примерно 0.4 секунды.

Из улучшений, думаю, можно продумать механизм "невычисления" произведения, в котором попадается ноль.

P.S. Изначальная цель блога - получить "фидбек" в комментариях, чтобы более опытные "кодеры" указывали мне на ошибки, советовали и всячески помогали в саморазвитии.

Также приглашаю всех на мой сайт)

На нем Вы можете посмотреть ответ на задачу Эйлера #11 (когда необходима лишь небольшая подсказка) и последний, самый быстрый вариант решения.

Контент - огонь))) подпишитесь!)
Контент - огонь))) подпишитесь!)

В общем, добро пожаловать на канал))