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

Решение 32 задачи проекта Эйлера: Пан-цифровые произведения

Основное, что понадобилось в программе - это хранение в массиве числа по его индексу и разложение числа на отдельные цифры.

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

Каждое n-значное число, которое содержит каждую цифру от 1 до n ровно один раз, будем считать пан-цифровым;

к примеру, 5-значное число 15234 является пан-цифровым, т.к. содержит цифры от 1 до 5.

Произведение 7254 является необычным, поскольку равенство 39 × 186 = 7254, состоящее из множимого, множителя и произведения является пан-цифровым, т.е. содержит цифры от 1 до 9.

Найдите сумму всех пан-цифровых произведений, для которых равенство "множимое × множитель = произведение" можно записать цифрами от 1 до 9, используя каждую цифру только один раз.

ПОДСКАЗКА: Некоторые произведения можно получить несколькими способами, поэтому убедитесь, что включили их в сумму лишь единожды.

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

Программа для решения задачи Эйлера #32
Программа для решения задачи Эйлера #32

Первое с чем понадобилось определиться - это с максимальным порядком цифр в произведении.

Так как цифр в произведении ровно 9, то откинув лишние варианты решил, что произведение может выглядеть примерно так:

a * bbbb = cccc
aa * bbb = cccc
aaa * bb = cccc
aaaa * b = cccc

Т.е. множители могут быть 4-значными или меньше, а их произведение - только 4-значным.

Множители таким образом перебираются в цикле до 10000.

Произведения решил хранить в массиве просто в виде чисел. Думал на счёт хранения значений чисел в массиве по индексу, т.е:

массив[число] = 1; //если есть такое число
массив[число] = 0; //если нет

Но решил, что незачем создавать массив[1000] для хранения нескольких значений (маловероятно, что будет много чисел, удовлетворяющих условиям задачи).

Далее программа в цикле перебирает множители и проверяет их:

  • что они не содержат 0 и содержат 5 цифр без повторов
  • что множители и ответ удовлетворяют условиям задачи
  • что такого ответа нет ещё в массиве
Функция, считающая количество цифр во множителях - задача Эйлера #32
Функция, считающая количество цифр во множителях - задача Эйлера #32

Чтобы не выполнять лишние операции решил отсечь множители, количество цифр в которых не равно 5.

Функция для проверки, является ли произведение пан-цифровым - задача Эйлера #32
Функция для проверки, является ли произведение пан-цифровым - задача Эйлера #32

Цифры из множителей и их произведения заносятся в массив, проверяется отсутствие в произведении 0 и наличие всех остальных девяти цифр.

В массив цифры заносятся по их индексу:

массив[число] = 1; //есть такое число
массив[число] = 0; //нет числа
Функция, которая заносит цифры числа в массив - задача Эйлера #32
Функция, которая заносит цифры числа в массив - задача Эйлера #32

Функция раскладывает число на цифры:

  • проверяет нет ли такой цифры в массиве
arr_arg[num_arg % 10] == 0
  • если нет, заносит его
  • и обрезает
num_arg /= 10;

При этом обе последние функции возвращают true/false в случае удачной/неудачной работы, что позволяет их использовать сразу в логике функции main().

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

Если есть неточности и ошибки - прошу указывать обязательно (на ошибках учатся)))

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

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

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

Тут справа кнопочка есть такая красненькая... "подписаться"... нужно нажать)
Тут справа кнопочка есть такая красненькая... "подписаться"... нужно нажать)

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