Сегодня с учениками разбирали программирование и я получил такой вопрос: «Можно ли запрограммировать задачу 17-го типа из ВПР по математике?». Что ж... И мы это с вами сделаем.
Задача
Задумали трехзначное число, все цифры которого различны и вторая цифра которого чётная. Из него вычли трехзначное число, записанное теми же цифрами в обратном порядке. Получили число 792. Найдите разность наибольшего и наименьшего чисел, удовлетворяющих таким условиям.
Решения:
Сначала произведем аналитическое решение задачи. Допустим, мы представляем наше число X = abc, тогда, судя по условию задачи, у нас накладываются ограничения на разряды:
◼ Числа а и с должны быть не равны нулям, потому что в противном случае прямое (abc) или обратно-зеркальное (cba) числа не будут являться зеркальными.
◼ Число b должно быть четным {0; 2; 4; 6; 8}
Далее нам нужно представить числа в удобной записи для нахождение разности. Прямое число X = 100⋅a + 10⋅b + c. Тогда обратное число Y = cba = 100⋅c + 10⋅b + c. Разница d = X - Y = 99⋅(a - c). И эта разница равна d = 792, которое представимо в виде 792 = 99⋅8. Получаем, что a - c = 8 или с = a - 8. при этом a может равняться только 9. Если a = 8, то с = a - 8 = 8 - 8 = 0, что противоречит условиям. Если a < 8, то с получается отрицательным, что недопустимо.
Теперь можно найти подходящие числа. Мы уже нашли, что a = 9 и с = 1. Остается максимизировать (минимизировать) b и найти подходящее четное число.
Ответ: 80
Как запрограммировать данную задачу и решить методом перебора?
Из числа нам понадобится получать зеркальное число. Напишем для этого функцию.
Можно написать так, чтобы функция работала с любыми числами. Но для этого надо пояснить на примере. Пусть у нас есть число x = 124. Функция invert() должна вернуть число 421. С помощью целочисленного деления (//) и деления с остатком (%) можно сделать так, чтобы last_digit пробегала по всем цифрам. Тогда зеркальное число можно сформировать, основываясь на свойствах позиционной десятичной системы счисления:
В кода на Python это будет выглядеть так:
Но есть и альтернативные варианты, когда используем строки или ограничиваем код на заранее правильный ввод - ввод заведомо трехзначного числа.
Я остановлюсь на первом варианте.
Далее понадобится написать функцию, которая бы возвращала True, если все числа числа являются уникальными.
Здесь меня соблазнили свойства множеств set. Если число перевести в строку (итерируемый объект), а потом применить функцию set() к строке, то получится множество из уникальных цифр числа. Соответственно, если для трехзначного числа размер (длина) множества len(set(str(x))) равна 3, то число уникально - вернуть True. В противном случае - вернуть False.
Кодом выглядит несложно:
Теперь остается собрать все условия с помощью написанных ранее функций и забрутфорсить решение:
Полный код:
Понравилась статья? Поставьте лайк, подпишитесь на канал, напишите комментарий! Вам не сложно, а мне очень приятно :)
Если Вам нужен репетитор по физике, математике или информатике/программированию, Вы можете написать мне или в мою группу Репетитор IT mentor в VK
Библиотека с книгами для физиков, математиков и программистов
Репетитор IT mentor в VK
Репетитор IT mentor в telegram