Основное, что понадобилось в программе - это хранение в массиве числа по его индексу и разложение числа на отдельные цифры.
Условия задачи
Каждое n-значное число, которое содержит каждую цифру от 1 до n ровно один раз, будем считать пан-цифровым;
к примеру, 5-значное число 15234 является пан-цифровым, т.к. содержит цифры от 1 до 5.
Произведение 7254 является необычным, поскольку равенство 39 × 186 = 7254, состоящее из множимого, множителя и произведения является пан-цифровым, т.е. содержит цифры от 1 до 9.
Найдите сумму всех пан-цифровых произведений, для которых равенство "множимое × множитель = произведение" можно записать цифрами от 1 до 9, используя каждую цифру только один раз.
ПОДСКАЗКА: Некоторые произведения можно получить несколькими способами, поэтому убедитесь, что включили их в сумму лишь единожды.
Описание работы программы
Первое с чем понадобилось определиться - это с максимальным порядком цифр в произведении.
Так как цифр в произведении ровно 9, то откинув лишние варианты решил, что произведение может выглядеть примерно так:
a * bbbb = cccc
aa * bbb = cccc
aaa * bb = cccc
aaaa * b = cccc
Т.е. множители могут быть 4-значными или меньше, а их произведение - только 4-значным.
Множители таким образом перебираются в цикле до 10000.
Произведения решил хранить в массиве просто в виде чисел. Думал на счёт хранения значений чисел в массиве по индексу, т.е:
массив[число] = 1; //если есть такое число
массив[число] = 0; //если нет
Но решил, что незачем создавать массив[1000] для хранения нескольких значений (маловероятно, что будет много чисел, удовлетворяющих условиям задачи).
Далее программа в цикле перебирает множители и проверяет их:
- что они не содержат 0 и содержат 5 цифр без повторов
- что множители и ответ удовлетворяют условиям задачи
- что такого ответа нет ещё в массиве
Чтобы не выполнять лишние операции решил отсечь множители, количество цифр в которых не равно 5.
Цифры из множителей и их произведения заносятся в массив, проверяется отсутствие в произведении 0 и наличие всех остальных девяти цифр.
В массив цифры заносятся по их индексу:
массив[число] = 1; //есть такое число
массив[число] = 0; //нет числа
Функция раскладывает число на цифры:
- проверяет нет ли такой цифры в массиве
arr_arg[num_arg % 10] == 0
- если нет, заносит его
- и обрезает
num_arg /= 10;
При этом обе последние функции возвращают true/false в случае удачной/неудачной работы, что позволяет их использовать сразу в логике функции main().
Ответ на задачу:
Если есть неточности и ошибки - прошу указывать обязательно (на ошибках учатся)))
P.S. Изначальная цель блога - получить "фидбек" в комментариях, чтобы более опытные "кодеры" указывали мне на ошибки, советовали и всячески помогали в саморазвитии.
Также приглашаю всех на мой сайт)
На нем Вы можете посмотреть ответ на задачу Эйлера 32 (когда необходима лишь небольшая подсказка) и последний, самый быстрый вариант решения.
В общем, добро пожаловать на канал))