Редакция для Строка в двоичный код
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно пройти по строке посимвольно и для каждого символа получить его ASCII-код в двоичном виде длины ровно 8 бит.
После этого все такие двоичные записи надо вывести через один пробел.
Например:
- символ
Aимеет ASCII-код65 - число
65в двоичной системе — это1000001 - но по условию нужен именно восьмибитовый код, значит надо дописать ведущий ноль:
01000001
2. Наблюдения
Вход — это одна строка, и в ней могут быть пробелы.
Значит, строку нужно считывать целиком, а не как одно слово.Каждый символ уже имеет числовой код:
- в C++ можно работать с символом
char - в Python можно использовать
ord(c)
- в C++ можно работать с символом
По условию нужен именно восьмибитовый код.
Это значит, что даже если двоичная запись короче 8 символов, слева нужно добавить нули.Все символы — печатные ASCII, поэтому каждый код точно помещается в 8 бит.
3. Алгоритм
- Считать всю строку.
- Создать список ответов.
- Для каждого символа строки:
- получить его числовой ASCII-код;
- перевести код в двоичный вид длины 8;
- добавить результат в список.
- Вывести все элементы списка через пробел.
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))
Комментарии