№14 Системы счисления

Системы счисления для ЕГЭ по информатике (Задание 14)


Задания: N14.Системы счисления


1. Основные понятия

Задание 14 ЕГЭ по информатике проверяет умение работать с системами счисления и выполнять арифметические операции с большими числами. Это задание часто требует использования длинной арифметики и работы с различными системами счисления (двоичная, восьмеричная, шестнадцатеричная и др.).

Типичные формулировки:

  • "Сколько единиц в двоичной записи числа ...?"
  • "Сколько нулей в двоичной записи числа ...?"
  • "Найдите значение выражения в указанной системе счисления"
  • "Переведите число из одной системы счисления в другую"

Важно: На экзамене ЕГЭ 2026 можно использовать Python для решения задач с большими числами, так как Python поддерживает длинную арифметику автоматически.


2. Системы счисления

2.1. Позиционные системы счисления

Определение: Система счисления, в которой значение цифры зависит от её позиции в числе.

Основание системы счисления (q): Количество различных цифр, используемых в системе.

Примеры:

  • Десятичная система (q=10): цифры 0-9
  • Двоичная система (q=2): цифры 0, 1
  • Восьмеричная система (q=8): цифры 0-7
  • Шестнадцатеричная система (q=16): цифры 0-9, A-F

2.2. Представление числа в позиционной системе

Число в системе счисления с основанием q записывается как:

N=an×qn+an1×qn1+...+a1×q1+a0×q0N = a_n \times q^n + a_{n-1} \times q^{n-1} + ... + a_1 \times q^1 + a_0 \times q^0

где $a_i$ это цифры числа, $0 \leq a_i < q$.

Пример: Число 1011₂ в двоичной системе: 10112=1×23+0×22+1×21+1×20=8+0+2+1=11101011_2 = 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 8 + 0 + 2 + 1 = 11_{10}


2.3. Перевод чисел между системами счисления

Из любой системы в десятичную:

  • Использовать развёрнутую форму записи числа
  • Вычислить сумму произведений цифр на степени основания

Из десятичной в любую систему:

  • Последовательно делить число на основание новой системы
  • Записывать остатки от деления в обратном порядке

В Python:

# Перевод в десятичную
int("1011", 2)  # 11
int("FF", 16)   # 255

# Перевод из десятичной
bin(11)         # "0b1011"
oct(255)        # "0o377"
hex(255)        # "0xff"

2.4. Метод разложения по степеням для перевода в двоичную систему

Метод разложения по степеням это способ перевода числа из десятичной системы в двоичную путём представления числа в виде суммы степеней двойки.

Алгоритм:

  1. Представить число в виде суммы степеней двойки
  2. Выписать все степени двойки от максимальной до нулевой
  3. На местах, где степень присутствует в разложении, поставить 1
  4. На местах, где степени нет, поставить 0

Пример: Перевод числа 35 в двоичную систему

Шаг 1: Разложим 35 на сумму степеней двойки 35=32+2+1=25+21+2035 = 32 + 2 + 1 = 2^5 + 2^1 + 2^0

Шаг 2: Выпишем все степени двойки от 5 до 0: 25,24,23,22,21,202^5, 2^4, 2^3, 2^2, 2^1, 2^0

Шаг 3: Определим, какие степени присутствуют:

  • $2^5$ (32) это есть → 1
  • $2^4$ (16) это нет → 0
  • $2^3$ (8) это нет → 0
  • $2^2$ (4) это нет → 0
  • $2^1$ (2) это есть → 1
  • $2^0$ (1) это есть → 1

Шаг 4: Запишем результат: 100011₂

Проверка: 1000112=1×25+0×24+0×23+0×22+1×21+1×20=32+0+0+0+2+1=3510100011_2 = 1 \times 2^5 + 0 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 32 + 0 + 0 + 0 + 2 + 1 = 35_{10}


2.5. Метод разложения по степеням для перевода в троичную систему

Метод разложения по степеням для троичной системы это способ перевода числа из десятичной системы в троичную путём представления числа в виде суммы степеней тройки с коэффициентами 0, 1 или 2.

Алгоритм:

  1. Представить число в виде суммы степеней тройки с коэффициентами (0, 1 или 2)
  2. Выписать все степени тройки от максимальной до нулевой
  3. На местах, где степень присутствует в разложении, поставить соответствующий коэффициент (0, 1 или 2)
  4. Если степень отсутствует, поставить 0

Важно: В троичной системе каждая позиция может содержать цифры 0, 1 или 2, поэтому при разложении нужно учитывать, что одна и та же степень может использоваться с коэффициентом 1 или 2.

Пример: Перевод числа 35 в троичную систему

Шаг 1: Найдём максимальную степень тройки, не превышающую 35

  • $3^3 = 27$ (меньше 35)
  • $3^4 = 81$ (больше 35)

Максимальная степень: $3^3 = 27$

Шаг 2: Разложим 35 на сумму степеней тройки 35=27+8=33+835 = 27 + 8 = 3^3 + 8

Теперь разложим 8: 8=2×3+2=2×31+2×308 = 2 \times 3 + 2 = 2 \times 3^1 + 2 \times 3^0

Полное разложение: 35=1×33+0×32+2×31+2×3035 = 1 \times 3^3 + 0 \times 3^2 + 2 \times 3^1 + 2 \times 3^0

Шаг 3: Выпишем все степени тройки от 3 до 0: 33,32,31,303^3, 3^2, 3^1, 3^0

Шаг 4: Определим коэффициенты:

  • $3^3$ (27) это коэффициент 1 → 1
  • $3^2$ (9) это коэффициент 0 → 0
  • $3^1$ (3) это коэффициент 2 → 2
  • $3^0$ (1) это коэффициент 2 → 2

Шаг 5: Запишем результат: 1022₃

Проверка: 10223=1×33+0×32+2×31+2×30=27+0+6+2=35101022_3 = 1 \times 3^3 + 0 \times 3^2 + 2 \times 3^1 + 2 \times 3^0 = 27 + 0 + 6 + 2 = 35_{10}


3. Длинная арифметика

3.1. Понятие длинной арифметики

Длинная арифметика это выполнение арифметических операций с числами, которые превышают диапазон стандартных целочисленных типов данных.

В Python: Целые числа (int) имеют неограниченную точность, поэтому длинная арифметика работает автоматически.

Пример:

# Обычные языки: переполнение при больших числах
# Python: работает с любыми числами
x = 4096**210 - 1024**67 + 256**32 - 64
print(x)  # Вычисляется корректно

3.2. Операции с большими числами

Сложение и вычитание:

  • Python автоматически обрабатывает большие числа
  • Результат может быть сколь угодно большим

Умножение:

  • Оператор ** для возведения в степень
  • Оператор * для умножения

Пример:

# Вычисление большого выражения
result = 4096**210 - 1024**67 + 256**32 - 64

3.3. Работа с двоичным представлением

Функция bin():

  • Преобразует число в строку с двоичным представлением
  • Возвращает строку с префиксом "0b"

Пример:

bin(11)        # "0b1011"
bin(11)[2:]    # "1011" (убираем префикс)

Подсчёт символов:

  • .count("1") это количество единиц
  • .count("0") это количество нулей

Пример:

s = 4096**210 - 1024**67 + 256**32 - 64
binary = bin(s)[2:]  # Двоичное представление без префикса
ones = binary.count("1")  # Количество единиц
zeros = binary.count("0")  # Количество нулей

4. Типы задач задания 14

4.1. Подсчёт единиц/нулей в двоичной записи

Формулировка: "Сколько единиц в двоичной записи числа 4096^210 - 1024^67 + 256^32 - 64?"

Алгоритм решения:

  1. Вычислить значение выражения
  2. Преобразовать в двоичную систему через bin()
  3. Убрать префикс "0b" через [2:]
  4. Подсчитать единицы через .count("1")

Код:

s = 4096**210 - 1024**67 + 256**32 - 64
print(bin(s)[2:].count("1"))

4.2. Арифметические операции в различных системах счисления

Формулировка: "Найдите значение выражения в указанной системе счисления"

Особенности:

  • Могут быть операции сложения, вычитания, умножения
  • Числа могут быть в разных системах счисления
  • Нужно привести к одной системе или выполнить операции напрямую

4.3. Перевод между системами счисления

Формулировка: "Переведите число из системы счисления с основанием X в систему с основанием Y"

Алгоритм:

  1. Перевести число в десятичную систему
  2. Перевести из десятичной в целевую систему

5. Работа с функциями Python для систем счисления

5.1. Преобразование в строковое представление

Функция Основание Пример Результат
bin(n) 2 bin(11) "0b1011"
oct(n) 8 oct(255) "0o377"
hex(n) 16 hex(255) "0xff"

Важно: Все функции возвращают строку с префиксом (0b, 0o, 0x). Для получения чистой строки используйте [2:].


5.2. Преобразование из строкового представления

Функция Основание Пример Результат
int(s, 2) 2 int("1011", 2) 11
int(s, 8) 8 int("377", 8) 255
int(s, 16) 16 int("FF", 16) 255

Важно: Второй аргумент функции int() указывает основание системы счисления.


5.3. Работа с подстроками

Методы строк для подсчёта:

  • .count(substring) это подсчитывает количество вхождений подстроки
  • [start:end] это срез строки

Пример:

binary = bin(11)[2:]  # "1011"
ones = binary.count("1")  # 3
zeros = binary.count("0")  # 1

6. Примеры решения задач

Пример 1: Подсчёт единиц в двоичной записи

Условие: Сколько единиц в двоичной записи числа 4096^210 - 1024^67 + 256^32 - 64?

Решение:

s = 4096**210 - 1024**67 + 256**32 - 64
print(bin(s)[2:].count("1"))

Объяснение:

  1. Вычисляем значение выражения: 4096**210 - 1024**67 + 256**32 - 64
  2. Преобразуем в двоичную систему: bin(s) → получаем строку с префиксом "0b"
  3. Убираем префикс: [2:] → получаем чистую двоичную строку
  4. Подсчитываем единицы: .count("1")

Ответ: 2100


Пример 2: Подсчёт нулей в двоичной записи

Условие: Сколько нулей в двоичной записи числа 2^100 - 2^50?

Решение:

s = 2**100 - 2**50
binary = bin(s)[2:]
zeros = binary.count("0")
print(zeros)

Пример 3: Работа с различными системами счисления

Условие: Найдите значение выражения (1011₂ + FF₁₆)₁₀ в десятичной системе.

Решение:

binary = int("1011", 2)  # 11
hex_num = int("FF", 16)  # 255
result = binary + hex_num
print(result)  # 266

7. Типичные ошибки и как их избежать

7.1. Ошибка: Забыли убрать префикс "0b"

Проблема: Использование bin(s).count("1") вместо bin(s)[2:].count("1")

Последствие: Префикс "0b" содержит одну единицу, что даёт неверный результат.

Решение: Всегда использовать [2:] для удаления префикса.


7.2. Ошибка: Неправильное основание при переводе

Проблема: Путают порядок аргументов в int() или используют неправильное основание.

Решение:

  • int("1011", 2) это правильно (строка, основание)
  • Проверять основание системы счисления в условии

7.3. Ошибка: Переполнение в других языках

Проблема: В языках типа C++/Java большие числа вызывают переполнение.

Решение: В Python этой проблемы нет, но нужно понимать, что Python автоматически использует длинную арифметику.


7.4. Ошибка: Неправильный подсчёт символов

Проблема: Путают .count("1") и .count("0") или считают все символы.

Решение:

  • Внимательно читать условие: "единиц" или "нулей"
  • Использовать правильный метод: .count("1") или .count("0")

8. Алгоритм решения задач задания 14

Шаг 1: Анализ условия

  • Определить, что нужно найти (единицы, нули, значение выражения)
  • Выписать выражение или числа
  • Определить системы счисления

Шаг 2: Выбор метода решения

  • Если большие числа → использовать Python с длинной арифметикой
  • Если перевод между системами → использовать int() и bin()/oct()/hex()
  • Если подсчёт символов → использовать .count()

Шаг 3: Написание кода

  • Вычислить значение выражения (если нужно)
  • Преобразовать в нужную систему счисления
  • Подсчитать требуемые символы

Шаг 4: Проверка результата

  • Проверить на простых примерах
  • Убедиться, что префиксы убраны
  • Проверить правильность подсчёта

9. Стратегия решения на экзамене

9.1. Время на задание 14

Рекомендуемое время: 5-8 минут

Распределение:

  • Чтение условия: 1 минута
  • Написание кода: 2-3 минуты
  • Запуск и проверка: 2-3 минуты
  • Проверка результата: 1 минута

9.2. Алгоритм действий

  1. Внимательно прочитать условие:

    • Что нужно найти (единицы, нули, значение)
    • Какие системы счисления используются
    • Какие операции нужно выполнить
  2. Написать код:

    • Вычислить выражение (если нужно)
    • Преобразовать в нужную систему
    • Подсчитать требуемые символы
  3. Запустить и проверить:

    • Проверить результат на простых примерах
    • Убедиться в правильности подсчёта

9.3. Если не получается

  • Проверьте, убран ли префикс "0b" через [2:]
  • Убедитесь, что используете правильное основание в int()
  • Проверьте, правильно ли считаете единицы/нули
  • Попробуйте вывести промежуточные результаты для отладки

10. Полезные приёмы

10.1. Работа с большими степенями

Важно: Python автоматически обрабатывает большие числа, но вычисления могут занять время.

Оптимизация:

  • Для очень больших чисел можно использовать промежуточные вычисления
  • Проверять результат на меньших примерах

10.2. Проверка результата

Способ 1: Проверка на простом примере

# Проверка: число 11 в двоичной = 1011, единиц = 3
test = 11
print(bin(test)[2:].count("1"))  # Должно быть 3

Способ 2: Вывод промежуточных результатов

s = 4096**210 - 1024**67 + 256**32 - 64
binary = bin(s)[2:]
print(f"Длина двоичной записи: {len(binary)}")
print(f"Единиц: {binary.count('1')}")
print(f"Нулей: {binary.count('0')}")

11. Ссылки на материалы

Подборка заданий в Яндекс Учебнике: №14. Системы счисления


Удачи на экзамене! 🎓