Подтема 4 из 6
Числа в системе счисления
Запись числа как слово из цифр: первая цифра не ноль, цифры без повторов, порядок и чётность.
Число как слово
Сколько существует четырёхзначных чисел в шестеричной системе?
Запись числа — слово из цифр, но первая цифра не может быть нулём. В системе с основанием q цифры — 0, 1, …, q − 1. Код может начинаться с нуля (007), а запись трёхзначного числа — нет: начальный ноль не добавляет разряд.
Поэтому четырёхзначных шестеричных чисел 5 · 6³ = 1080: на первое место — пять ненулевых цифр, на остальные — все шесть.
Цифры числами
Цифры удобно перебирать числами: product(range(q), repeat=n). Тогда «цифра больше 12» — это d > 12, а «цифра D» в шестнадцатеричной системе — значение 13.
from itertools import product count = 0for digits in product(range(6), repeat=4): if digits[0] != 0: count += 1print(count)Тонкости:цифры строками
Если цифры записаны символами, '2' + '3' даёт строку '23', а не 5. Перевод записи в число — int(запись, основание):
print('2' + '3', int('2') + int('3'))print(int('1032', 6), int('D', 16), int('A0', 16))Цифры без повторов
Если цифры не повторяются, начальный ноль всё равно исключают отдельно. Четырёхзначных шестеричных чисел с различными цифрами 5 · 5 · 4 · 3 = 300: первая — любая, кроме нуля; вторая — любая, кроме первой, ноль уже можно.
from itertools import permutations count = 0for digits in permutations(range(6), 4): if digits[0] != 0: count += 1print(count)Порядок цифр
При строгом убывании набор цифр выстраивается единственным способом, поэтому чисел столько же, сколько наборов.
Четырёхзначных шестеричных чисел со строго убывающими цифрами — C₆⁴ = 15: ноль окажется последним. При строгом возрастании ноль встал бы первым, поэтому цифры берут из 1–5: C₅⁴ = 5.
from itertools import product down = 0up = 0for d in product(range(6), repeat=4): if d[0] != 0 and d[0] > d[1] > d[2] > d[3]: down += 1 if d[0] != 0 and d[0] < d[1] < d[2] < d[3]: up += 1print(down, up)Чётность
Ноль — чётная цифра, а чётность цифры и чётность числа — разное. Условие о чётных цифрах проверяют по каждой цифре: d % 2 == 0.
Чётность всего числа при чётном основании решает последняя цифра, а при нечётном — сумма цифр. Например, 12₃ = 5: последняя цифра чётная, а число нечётное.
Тонкости:почему решает сумма цифр
Запись d₁ · q² + d₂ · q + d₃. При чётном q первые слагаемые чётные, всё решает d₃. При нечётном q все степени основания нечётные, и каждое слагаемое имеет ту же чётность, что его цифра.
Если чётные и нечётные цифры чередуются, считают по двум схемам. Четырёхзначные шестеричные числа с различными цифрами: схема «чётная, нечётная, …» — 2 · 3 · 2 · 2 = 24 (первая чётная не ноль), схема «нечётная, чётная, …» — 3 · 3 · 2 · 2 = 36. Всего 60.
from itertools import permutations count = 0for digits in permutations(range(6), 4): if digits[0] != 0: good = True for i in range(3): if digits[i] % 2 == digits[i + 1] % 2: good = False break if good: count += 1print(count)Рядом с цифрой
Условие «рядом с цифрой 5 нет нечётных» проверяют по соседям этой цифры. Позицию даёт d.index(5), соседи — позиции i - 1 и i + 1, если они есть. Пройди проверку числа 2501₆ по шагам:
d = (2, 5, 0, 1)i = d.index(5)good = Truefor j in (i - 1, i + 1): if 0 <= j < 4 and d[j] % 2 == 1: good = Falseprint(good)Посчитаем четырёхзначные шестеричные числа с ровно одной цифрой 5, рядом с которой только чётные:
from itertools import product count = 0for d in product(range(6), repeat=4): if d[0] == 0 or d.count(5) != 1: continue i = d.index(5) good = True for j in (i - 1, i + 1): if 0 <= j < 4 and d[j] % 2 == 1: good = False if good: count += 1print(count)continue сразу переходит к следующему числу, если первая цифра ноль или пятёрок не одна. Проверка 0 <= j < 4 отбрасывает несуществующих соседей у крайней цифры.
Итого
- n-значных чисел(q − 1) · qⁿ⁻¹: первая цифра не ноль
- Перебор
product(range(q), repeat=n), цифры — числа - Строгий порядокчисел столько, сколько наборов цифр
- Чётность числачётное основание — последняя цифра, нечётное — сумма
- Соседи цифрыпозиции i − 1 и i + 1, если есть
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
007 — это однозначное число 7, а как код — три символа.ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Трёхзначные пятеричные числа
Сколько существует положительных трёхзначных чисел в пятеричной системе?
Введите число.
Подсказка
Первая цифра не ноль.
Решение
Первая цифра — от 1 до 4 (4 варианта), две остальные — любые из пяти: 4 · 5² = 100.
Решение программой
from itertools import product count = 0for d in product(range(5), repeat=3): if d[0] != 0 and True: count += 1print(count)Ответ: 100
Ровно одна цифра 6
Сколько трёхзначных восьмеричных чисел содержит ровно одну цифру 6? Остальные цифры могут повторяться.
Введите число.
Подсказка
Разбери, где стоит шестёрка.
Решение
Если 6 стоит первой, две другие цифры — любые, кроме 6: 7² = 49. Если 6 на одном из двух других мест, первая цифра — не 0 и не 6 (6 вариантов), третья — любая, кроме 6 (7): 2 · 6 · 7 = 84. Всего 133.
Решение программой
from itertools import product count = 0for d in product(range(8), repeat=3): if d[0] != 0 and d.count(6) == 1: count += 1print(count)Ответ: 133
Различные 12-ричные цифры, две больше 8
Сколько существует 12-ричных четырёхзначных чисел, все цифры которых различны, а ровно две цифры имеют значение больше 8?
Введите число.
Подсказка
Большие цифры — 9, 10, 11.
Решение
Большие цифры — 9, 10, 11. Если первая цифра большая, на неё 3 варианта, вторую большую ставят на одно из трёх мест (2 варианта цифры), два оставшихся места — малые цифры без повторов: 3 · 3 · 2 · 9 · 8 = 1296. Если первая малая (от 1 до 8), большие ставят на 2 из 3 остальных мест: 8 · 3 · 3 · 2 · 8 = 1152. Всего 2448.
Решение программой
from itertools import product count = 0for d in product(range(12), repeat=4): if ( d[0] != 0 and len(set(d)) == 4 and sum(x > 8 for x in d) == 2 ): count += 1print(count)Ответ: 2448
Различные цифры
Сколько существует четырёхзначных восьмеричных чисел, все цифры которых различны?
Введите число.
Подсказка
Начальный ноль учитывают отдельно.
Решение
Первая цифра — не ноль (7 вариантов), вторая — любая из оставшихся семи, включая ноль, третья — из шести, четвёртая — из пяти: 7 · 7 · 6 · 5 = 1470.
Решение программой
from itertools import product count = 0for d in product(range(8), repeat=4): if d[0] != 0 and len(set(d)) == 4: count += 1print(count)Ответ: 1470
Последняя цифра 0, длина не задана
Сколько существует натуральных чисел, семеричная запись которых содержит не менее двух цифр, все цифры различны, а последняя цифра — 0?
Введите число.
Подсказка
Посчитай по каждой длине и сложи.
Решение
Ноль стоит последним, остальные места занимают различные цифры от 1 до 6. Для длин 2–7 это 6 + 30 + 120 + 360 + 720 + 720 = 1956.
Решение программой
from itertools import permutations count = 0for length in range(2, 8): count += len(list(permutations(range(1, 7), length - 1)))print(count)Ответ: 1956
Строго возрастающие цифры
Сколько существует трёхзначных семеричных чисел со строго возрастающими цифрами?
Введите число.
Подсказка
Расстановку заменяет выбор трёх цифр из 1–6.
Решение
При строгом возрастании каждый набор цифр даёт одно число, а ноль стоял бы первым, поэтому цифры выбирают из 1–6: C₆³ = 20.
Решение программой
from itertools import product count = 0for d in product(range(7), repeat=3): if d[0] != 0 and d[0] < d[1] < d[2]: count += 1print(count)Ответ: 20
Чётные семеричные четырёхзначные
Сколько существует чётных четырёхзначных чисел в семеричной системе?
Введите число.
Подсказка
При нечётном основании последняя цифра чётность не решает.
Решение
Основание 7 нечётное, поэтому чётность числа решает сумма цифр, а не последняя цифра. Четырёхзначные семеричные числа — от 7³ = 343 до 7⁴ − 1 = 2400, чётных среди них 1029.
Решение программой
print(sum(1 for n in range(7 ** 3, 7 ** 4) if n % 2 == 0))Ответ: 1029
Две семёрки без чётных соседей
Сколько существует восьмеричных пятизначных чисел, в записи которых ровно две цифры 7, при этом никакая чётная цифра не стоит рядом с цифрой 7?
Введите число.
Подсказка
Проверь соседей каждой семёрки.
Решение
Программа перебирает все пятизначные восьмеричные числа и для каждой семёрки проверяет обоих соседей: чётных среди них быть не должно. Подходит 651 число.
Решение программой
from itertools import product count = 0for d in product(range(8), repeat=5): if d[0] == 0 or d.count(7) != 2: continue ok = True for i in range(5): if d[i] == 7: for j in (i - 1, i + 1): if 0 <= j < 5 and d[j] % 2 == 0: ok = False if ok: count += 1print(count)Ответ: 651