Найти в Дзене
Репетитор IT mentor

Теория чисел в школьной задаче: аналитическое решение + кодинг

Оглавление

Сегодня с учениками разбирали программирование и я получил такой вопрос: «Можно ли запрограммировать задачу 17-го типа из ВПР по математике?». Что ж... И мы это с вами сделаем.

Задача

Задумали трехзначное число, все цифры которого различны и вторая цифра которого чётная. Из него вычли трехзначное число, записанное теми же цифрами в обратном порядке. Получили число 792. Найдите разность наибольшего и наименьшего чисел, удовлетворяющих таким условиям.

Решения:

Сначала произведем аналитическое решение задачи. Допустим, мы представляем наше число X = abc, тогда, судя по условию задачи, у нас накладываются ограничения на разряды:

◼ Числа а и с должны быть не равны нулям, потому что в противном случае прямое (abc) или обратно-зеркальное (cba) числа не будут являться зеркальными.

◼ Число b должно быть четным {0; 2; 4; 6; 8}

-2

Далее нам нужно представить числа в удобной записи для нахождение разности. Прямое число 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, то с получается отрицательным, что недопустимо.

-3

Теперь можно найти подходящие числа. Мы уже нашли, что a = 9 и с = 1. Остается максимизировать (минимизировать) b и найти подходящее четное число.

-4

Ответ: 80

Как запрограммировать данную задачу и решить методом перебора?

Из числа нам понадобится получать зеркальное число. Напишем для этого функцию.

Можно написать так, чтобы функция работала с любыми числами. Но для этого надо пояснить на примере. Пусть у нас есть число x = 124. Функция invert() должна вернуть число 421. С помощью целочисленного деления (//) и деления с остатком (%) можно сделать так, чтобы last_digit пробегала по всем цифрам. Тогда зеркальное число можно сформировать, основываясь на свойствах позиционной десятичной системы счисления:

-5

В кода на Python это будет выглядеть так:

-6

Но есть и альтернативные варианты, когда используем строки или ограничиваем код на заранее правильный ввод - ввод заведомо трехзначного числа.

-7

Я остановлюсь на первом варианте.

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

Здесь меня соблазнили свойства множеств set. Если число перевести в строку (итерируемый объект), а потом применить функцию set() к строке, то получится множество из уникальных цифр числа. Соответственно, если для трехзначного числа размер (длина) множества len(set(str(x))) равна 3, то число уникально - вернуть True. В противном случае - вернуть False.

Кодом выглядит несложно:

-8

Теперь остается собрать все условия с помощью написанных ранее функций и забрутфорсить решение:

-9

Полный код:

-10

Понравилась статья? Поставьте лайк, подпишитесь на канал, напишите комментарий! Вам не сложно, а мне очень приятно :)

Репетитор IT mentor

Если Вам нужен репетитор по физике, математике или информатике/программированию, Вы можете написать мне или в мою группу Репетитор IT mentor в VK

Библиотека с книгами для физиков, математиков и программистов
Репетитор IT mentor в VK
Репетитор IT mentor в telegram