Краткая теория
- Позиционные системы счисления — системы, где значение цифры зависит от её позиции (разряда).
- Чтобы перевести число
12345<sub>N</sub>в десятичную систему, нужно:1·N⁴ + 2·N³ + 3·N² + 4·N¹ + 5·N⁰ - Последняя цифра числа в системе с основанием N — это остаток от деления на N.
- Число
10<sub>N</sub>— единица и N нулей;10<sub>N</sub>−1— N девяток (или N−1 в любой системе). a<sup>N</sup>−1в системе с основанием a записывается как N старших цифр (a−1).
Стандартные функции Python для перевода
В Python есть встроенные функции для перевода десятичного числа в другие системы счисления:
bin(x)→ двоичная форма (строка с префиксом0b)oct(x)→ восьмеричная форма (строка с префиксом0o)hex(x)→ шестнадцатеричная форма (строка с префиксом0x)
n = 67
print(bin(n)) # 0b1000011
print(oct(n)) # 0o103
print(hex(n)) # 0x43
Чтобы убрать префикс, используем срез: bin(n)[2:].
Использование функции int()
Функция int() позволяет переводить строку, представляющую число в системе с основанием от 2 до 36, в десятичное число:
print(int("1010", 2)) # 10
print(int("7B", 16)) # 123
print(int("234", 5)) # 69
⚠️ Максимальное основание = 36, так как для обозначения цифр используются символы 0–9 и A–Z.
Алгоритмы перевода чисел
Из произвольной системы в десятичную
Алгоритм (Horner):
┌───────────────────────────────────────────────┐
│ Вход: строка s = cₖ…c₂c₁c₀ (в базе N) │
│ Выход: десятичное значение │
├───────────────────────────────────────────────┤
│ value := 0 │
│ для каждой цифры c из s слева направо: │
│ value := value * N + val(c) │
│ вернуть value │
└───────────────────────────────────────────────┘
Пример: s = 234₅
value = 0
→ (2): value = 0*5 + 2 = 2
→ (3): value = 2*5 + 3 = 13
→ (4): value = 13*5 + 4 = 69
Ответ: 69₁₀
Каждая цифра умножается на основание в степени разряда:
234<sub>5</sub> = 2·5² + 3·5¹ + 4·5⁰ = 50 + 15 + 4 = 69
Из десятичной в произвольную систему
Алгоритм (целая часть):
┌─────────────────────────────────────────┐
│ Вход: десятичное число X, основание N │
│ Выход: запись X в системе с основанием N│
├─────────────────────────────────────────┤
│ пока X > 0: │
│ r := X mod N ← остаток (цифра) │
│ X := X div N ← целая часть │
│ записать r слева к уже найденным │
│ если цифр нет → результат "0" │
└─────────────────────────────────────────┘
Пример: X=69, N=5
┌───────────┬──────────┬────────────┬─────────────┐
│ Итерация │ X : N │ Остаток r │ Новая X │
├───────────┼──────────┼────────────┼─────────────┤
│ 1 │ 69 : 5 │ 4 │ 13 │
│ 2 │ 13 : 5 │ 3 │ 2 │
│ 3 │ 2 : 5 │ 2 │ 0 │
└───────────┴──────────┴────────────┴─────────────┘
Читаем остатки снизу вверх → 234₅
Используется деление с остатком:
- Делим число на основание N.
- Запоминаем остаток.
- Продолжаем, пока частное ≠ 0.
- Читаем остатки в обратном порядке.
69 : 5 = 13 остаток 4
13 : 5 = 2 остаток 3
2 : 5 = 0 остаток 2
=> 234<sub>5</sub>
Реализация функций перевода в Python
Цикл
def dec2base(n, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
res = ""
while n > 0:
res = digits[n % base] + res
n //= base
return res or "0"
print(dec2base(69, 5)) # 234
Рекурсия
def dec2base_rec(n, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if n < base:
return digits[n]
return dec2base_rec(n // base, base) + digits[n % base]
print(dec2base_rec(69, 5)) # 234
Работа с буквами
Отображение цифр:
0 1 2 3 4 5 6 7 8 9 A B C D E F ... Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 35
Пример (HEX): 0x7B = 7*16 + 11 = 123
Пример (BASE-36): "AZ" = 10*36 + 35 = 395
Для оснований больше 10 цифры выше 9 заменяются буквами: A=10, B=11, ... F=15.
При переводе используем строку-алфавит: abc = "0123456789ABCDEF"
Перевод в десятичную из произвольной
def base2dec(s, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s = s.upper()
n = 0
for ch in s:
n = n * base + digits.find(ch)
return n
print(base2dec("234", 5)) # 69
Разбор типовых заданий
Задание 1
49⁷ + 7²¹ − 7. Найти количество цифр 6 в 7-ичной записи.
res = 49**7 + 7**21 - 7
count6 = 0
while res > 0:
if res % 7 == 6:
count6 += 1
res //= 7
print(count6)
Задание 2
Сколько значащих нулей в двоичной записи числа 4**512 + 8**512 − 2**128 − 250?
res = 4**512 + 8**512 - 2**128 - 250
print(bin(res)[2:].count('0'))
Задание 3
Число 67₁₀ в системе с основанием N оканчивается на 1 и содержит 4 цифры. Найти N.
def dec2x(dig, x):
res = ''
while dig:
d = dig % x
res = (chr(ord('A') + d - 10) if d >= 10 else str(d)) + res
dig //= x
return res
for i in range(2, 36):
d = dec2x(67, i)
if d.endswith('1') and len(d) == 4:
print(i)
break
Контрольные вопросы и мини-задания
- Что такое позиционная система счисления?
- Как перевести число из системы N в 10-ичную?
- Почему функция
int()принимает основание до 36? - Чему равен результат
int('F', 16)? - Сколько значащих нулей имеет число
16**3в шестнадцатеричной записи? - Переведите 345₁₀ в систему с основанием 8.
- Как записывается 2ⁿ − 1 в двоичной системе?
- Какое наименьшее основание системы, в которой 30 — трёхзначное число?
- Запишите число 255 в 16-ричной и 8-ричной системах.
- Напишите функцию, возвращающую количество цифр «A» в 16-ричной записи чисел от 100 до 200.
Задания для подготовки
Простые
- https://kompege.ru/task?id=13 Смотреть разбор
- https://kompege.ru/task?id=242 Смотреть разбор
- https://kompege.ru/task?id=244
- https://kompege.ru/task?id=247
- https://kompege.ru/task?id=23752 Смотреть разбор
Средние
- https://kompege.ru/task?id=246 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=68276 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=48393 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=16043 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=63063 Смотреть разбор Вариант 2
- https://inf-ege.sdamgia.ru/problem?id=64944 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=48435 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=58481 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=13627 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=48384 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=48394 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=47218 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=39243 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=58522 Смотреть разбор
- https://kompege.ru/task?id=16325 Смотреть разбор
- https://kompege.ru/task?id=21709 Смотреть разбор
- https://kompege.ru/task?id=21900 Смотреть разбор
- https://kompege.ru/task?id=17870 Смотреть разбор
- https://kompege.ru/task?id=17869 Смотреть разбор
- https://kompege.ru/task?id=17868 Смотреть разбор Вариант 2
- https://kompege.ru/task?id=17870 Смотреть разбор
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5918 Смотреть разбор
- https://education.yandex.ru/ege/variants/c01534c6-0b3e-4da7-9d99-6c8d759babaf/task/14 Смотреть разбор
- https://kompege.ru/task?id=23198 Смотреть разбор
- https://kompege.ru/task?id=23391 Смотреть разбор
- https://kompege.ru/task?id=23390 Смотреть разбор
- https://kompege.ru/task?id=23273 Смотреть разбор
- https://kompege.ru/task?id=23198 Смотреть разбор
- https://kompege.ru/task?id=20284 Смотреть разбор
Сложные
https://kompege.ru/task?id=24619
https://kompege.ru/task?id=19028
https://kompege.ru/task?id=18169
https://kompege.ru/task?id=18168
https://kompege.ru/task?id=9918
https://kompege.ru/task?id=9914
https://kompege.ru/task?id=9904
https://kompege.ru/task?id=7702
https://kompege.ru/task?id=5895
https://kompege.ru/task?id=5879
https://kompege.ru/task?id=5436
https://kompege.ru/task?id=3775
https://kompege.ru/task?id=3759
https://kompege.ru/task?id=3758
https://kompege.ru/task?id=1753
https://kompege.ru/task?id=1344
https://kompege.ru/task?id=1056
https://kompege.ru/task?id=926
https://kompege.ru/task?id=828
https://kompege.ru/task?id=778
https://kompege.ru/task?id=722
https://kompege.ru/task?id=271
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8254
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8052
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8045
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7841
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7840
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7839
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7838
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7677
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7676
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7473
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6898
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6897
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6470
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6469
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6468
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6221
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5995
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5823
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5822
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5821
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5820
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5819
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5818
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5817
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5816
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5815
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5814
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5813
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5812
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5811
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5810
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5809
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5808
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5807
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5806
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5705
https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=5704
https://education.yandex.ru/ege/inf/task/58a63517-ce35-4416-8b9f-5a719e4ea77e
https://education.yandex.ru/ege/inf/task/021d2ffa-3915-42ef-87ae-258cf3ff5673
https://education.yandex.ru/ege/inf/task/1630a1f6-eb68-4a20-8be5-6c1552224ed7
https://education.yandex.ru/ege/inf/task/d4584e0e-7f27-47de-bf19-688170399d46
https://education.yandex.ru/ege/inf/task/47e2b15a-915c-43b2-a98a-deadddb91502
https://education.yandex.ru/ege/inf/task/45de346b-e054-48b5-a4ab-414c7b117edb
https://education.yandex.ru/ege/inf/task/c53cc9a0-13d9-4dea-9d7b-46c5cee0965f
https://education.yandex.ru/ege/inf/task/670e5c1b-0a49-400b-9e68-b4f92db39c45
https://education.yandex.ru/ege/inf/task/ae1e6ebd-512c-4ea3-9bb6-6862096652d8
https://education.yandex.ru/ege/inf/task/29fa61ad-cac1-4b57-a9ac-673ff4abd400
https://education.yandex.ru/ege/inf/task/5b214f5e-974b-46db-bf04-5aa73d9d99d3
https://education.yandex.ru/ege/inf/task/376fdf5f-fe0f-49fe-873c-698126bf1ccd
https://education.yandex.ru/ege/inf/task/de78f4fe-7180-4347-be54-c0df9f1467d0
