Разбор задачи 17
Канал авторов: телеграм (кликабельно)
Начальные знания: ЯП, 17 задание
Текст задачи:
Задача может показаться тривиальной, если вы уже достаточно много решили похожих заданий, но ее прелесть в интересном диапазоне и постепенным улучшением кода. Разберем несколько версий программы
Первая версия
Создаем счетчики и переменные k (для кол-ва), mn (для минимума), mx (для максимума). Обнулим счетчик. А максимуму и минимуму зададим недостижимые значения по такому правилу:
Если ищем минимум, присваиваем максимум
Если ищем максимум, присваиваем минимум
И это логично: как мы найдем максимум в диапазоне, если текущая переменная и так больше всех чисел?
k = 0 mn = 10**10 mx = 0
Определимся с диапазоном. Так как python не позволяет создавать объединенный диапазон с помощью range, исхитримся и создадим два отдельных, а затем объединим. Например, так как в коде ниже:
our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1))
Важно отметить, что я оборачиваю range в list, потому что иначе невозможна конкатенация (объединение) нескольких диапазонов.
Прибавлять 1 к диапазону в правой границе нужно для включения числа в диапазон, так как в языке исходно в range правая граница не включена.
Пробежимся по новому диапазону и отыщем нужные по условию числа:
for n in our_range: if (n % 7 == 0 and n %11 != 0 and n % 23 != 0) and (n % 10 != 8): k += 1 mx = max(mx, n) mn = min(mn, n)
Замечу, что чтобы узнать последнюю цифру числа в десятичной СС, нужно взять остаток от деления на 10 от нашего числа. Именно это мы и проверяем в последней части условия.
Дальше остается только вывести ответ:
print(k, mx-mn)
Весь код:
k = 0 mn = 10**10 mx = 0 our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1)) for n in our_range: if (n % 7 == 0 and n %11 != 0 and n % 23 != 0) and (n % 10 != 8): k += 1 mx = max(mx, n) mn = min(mn, n) print(k, mx-mn)
Вторая версия
Вынесем условие в отедельную функцию:
def is_good(n): return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8)
Весь код:
def is_good(n): return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8) k = 0 mn = 10**10 mx = 0 our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1)) for n in our_range: if is_good(n): k += 1 mx = max(mx, n) mn = min(mn, n) print(k, mx-mn)
Уже симпатичнее.
Третья версия
Избавляемся от лишних переменных, создавая отобраный по условию из функции диапазон.
Весь код:
def is_good(n): return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8) our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1)) answer = [n for n in our_range if is_good(n)ъ print(len(answer), max(answer) - min(answer))
Здесь используется генератор списка. Подробнее в официальной документации и в статье по 17ым задачам.
Канал авторов: телеграм