8.02 Подсчет количества слов/чисел
Ошибка.
Попробуйте повторить позже
Сколько существует восьмеричных пятизначных чисел, не содержащих в своей записи цифру 1, в которых все цифры различны и никакие две чётные или две нечётные цифры не стоят рядом? Любую цифру можно использовать любое количество раз.
Решение руками
В 8-й системе счисления всего 8 цифр: 7, 6, 5, 4, 3, 2, 1 и 0. По условию в числе не должно присутствовать цифры 1, поэтому алфавит сокращаетcя до 7, 6, 5, 4, 3, 2, 0. Всего получилось четыре чётных цифры и три нечётные.
Так как недопустимо ставить рядом две цифры одинаковой чётности, чётные и нечётные цифры должны чередоваться, таких вариантов всего два: Ч Н Ч Н Ч и Н Ч Н Ч Н.
Запишем эти же варианты, но с количеством цифр из алфавита, не забывая, что на первом месте в числе не может стоять ноль и что цифры должны быть различные. Получим:
Решение через циклы:
Сначала создаём пустое множество ans, куда будем добавлять все допустимые числа, чтобы исключить повторения. Обозначим строку a = "0234567" как набор доступных цифр, исключая 1, которые могут стоять на любой позиции. Для каждой позиции числа создаём вложенные циклы, перебирая все возможные варианты:
- x1 — первая цифра, должна быть не нулём, поэтому цикл идёт по строке "234567".
- x2, x3, x4, x5 — остальные цифры, перебираются по строке a, содержащей все разрешённые цифры.
Для каждой комбинации формируем строку s = x1 + x2 + x3 + x4 + x5. Далее проверяем два условия:
1. В числе нет подряд стоящих чётных или нечётных цифр. Для этого используем генератор all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)), который проверяет для каждой пары соседних цифр, что остатки от деления на 2 различны.
2. Все цифры числа различны, что проверяется условием len(s) == len(set(s)), где set(s) создаёт множество уникальных символов строки.
Если оба условия выполняются, добавляем число в множество ans. После перебора всех вариантов выводим длину множества len(ans), что и есть количество допустимых чисел.
# Создаём пустое множество для хранения допустимых чисел ans = set() # Строка с доступными цифрами a = "0234567" # Перебор первой цифры числа (не 0) for x1 in "234567": # Перебор второй цифры числа for x2 in a: # Перебор третьей цифры числа for x3 in a: # Перебор четвёртой цифры числа for x4 in a: # Перебор пятой цифры числа for x5 in a: # Формируем строку числа s = x1 + x2 + x3 + x4 + x5 # Проверяем условия: # 1. Нет подряд идущих чётных или нечётных цифр # 2. Все цифры различны if all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)) and len(s) == len(set(s)): # Если условия выполнены, добавляем число в множество ans.add(s) # Вывод количества допустимых чисел print(len(ans))
Решение через itertools:
Используем модуль itertools и функцию product, которая генерирует все возможные комбинации цифр длины 5 с повторениями. Перебираем все комбинации из строки a = "0234567" и формируем число из кортежа с помощью .join(i). Для каждой комбинации проверяем:
1. Первая цифра не ноль (s[0] != ’0’). 2. Нет соседних чётных или нечётных цифр, проверка такая же, как в циклах. 3. Все цифры различны.
Если условия выполнены, добавляем число в множество ans. После перебора выводим длину множества.
from itertools import product # Создаём пустое множество для хранения допустимых чисел ans = set() # Строка с доступными цифрами a = ’0234567’ # Генерация всех комбинаций длины 5 с повторениями for i in product(a, repeat=5): # Преобразуем кортеж в строку s = ’’.join(i) # Проверяем условия: # 1. Первая цифра не 0 # 2. Нет подряд идущих чётных или нечётных цифр # 3. Все цифры различны if (s[0] != ’0’) and all(int(s[i]) % 2 != int(s[i + 1]) % 2 for i in range(len(s) - 1)) and len(s) == len(set(s)): # Если условия выполнены, добавляем число в множество ans.add(s) # Вывод количества допустимых чисел print(len(ans))
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!