Редакция для Строка в двоичный код


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно пройти по строке посимвольно и для каждого символа получить его ASCII-код в двоичном виде длины ровно 8 бит.

После этого все такие двоичные записи надо вывести через один пробел.

Например:

  • символ A имеет ASCII-код 65
  • число 65 в двоичной системе — это 1000001
  • но по условию нужен именно восьмибитовый код, значит надо дописать ведущий ноль: 01000001

2. Наблюдения

  1. Вход — это одна строка, и в ней могут быть пробелы.
    Значит, строку нужно считывать целиком, а не как одно слово.

  2. Каждый символ уже имеет числовой код:

    • в C++ можно работать с символом char
    • в Python можно использовать ord(c)
  3. По условию нужен именно восьмибитовый код.
    Это значит, что даже если двоичная запись короче 8 символов, слева нужно добавить нули.

  4. Все символы — печатные ASCII, поэтому каждый код точно помещается в 8 бит.

3. Алгоритм

  1. Считать всю строку.
  2. Создать список ответов.
  3. Для каждого символа строки:
    • получить его числовой ASCII-код;
    • перевести код в двоичный вид длины 8;
    • добавить результат в список.
  4. Вывести все элементы списка через пробел.

4. Почему это работает

Рассмотрим любой символ строки.

  • У каждого печатного ASCII-символа есть однозначный числовой код.
  • По условию нужно заменить символ именно его восьмибитовым двоичным ASCII-кодом.
  • Значит, для каждого символа достаточно:
    • взять его ASCII-код,
    • записать этот код в двоичной системе,
    • дополнить слева нулями до длины 8.

Если сделать это для всех символов строки по порядку, то получится ровно та последовательность кодов, которую требует задача.

Порядок символов сохраняется, и между кодами ставится один пробел, как указано в формате вывода.

5. Сложность

Пусть длина строки равна n.

  • Время работы: O(n), потому что каждый символ обрабатывается один раз.
  • Память: O(n), если хранить все полученные коды в списке перед выводом.

6. Код на C++17

#include <iostream>
#include <string>
#include <vector>
#include <bitset>

using namespace std;

int main() {
    string s;
    getline(cin, s);

    vector<string> ans;
    for (char c : s) {
        ans.push_back(bitset<8>(static_cast<unsigned char>(c)).to_string());
    }

    for (int i = 0; i < (int)ans.size(); i++) {
        if (i > 0) {
            cout << ' ';
        }
        cout << ans[i];
    }
    cout << '\n';

    return 0;
}

7. Код на Python 3

s = input()
codes = [format(ord(c), '08b') for c in s]
print(' '.join(codes))

Комментарии

Еще нет ни одного комментария.