Редакция для Шестнадцатеричный код в строку
Submitting an official solution before solving the problem yourself is a bannable offence.
Шестнадцатеричный код в строку
1. Идея
Дана строка из шестнадцатеричных цифр. Из условия известно, что каждые две соседние цифры — это код одного ASCII-символа.
Значит, задача сводится к очень прямому действию:
- разбить строку на пары символов;
- каждую пару перевести из шестнадцатеричной записи в число;
- по этому числу получить ASCII-символ;
- собрать все символы в ответ.
Например, "41" в шестнадцатеричной системе — это 65 в десятичной, а ASCII-код 65 соответствует символу 'A'.
2. Наблюдения
Наблюдение 1
Шестнадцатеричная система использует цифры:
0–9со значениями0–9,a–fсо значениями10–15.
То есть пара символов вроде "4f" означает:
- первая цифра
4— это4, - вторая цифра
f— это15, - всё число равно
4 * 16 + 15 = 79.
Наблюдение 2
Так как каждые две цифры образуют один символ, длина строки всегда чётная, и можно идти по ней с шагом 2.
Наблюдение 3
Гарантируется, что каждая пара задаёт печатный ASCII-символ, поэтому дополнительно проверять корректность не нужно.
3. Алгоритм
- Считать строку
s. - Создать пустую строку ответа.
- Перебирать
sпо два символа:- взять символы
s[i]иs[i + 1]; - перевести их из шестнадцатеричной записи в число от
0до255; - преобразовать это число в символ;
- добавить символ к ответу.
- взять символы
- Вывести полученную строку.
Как перевести пару шестнадцатеричных цифр в число
Если есть два символа x и y, то:
value(x)— значение первой цифры,value(y)— значение второй цифры,
тогда итоговое число равно:
value(x) * 16 + value(y)
В Python это можно сделать встроенной функцией int(..., 16), а в C++ — вручную через функцию перевода одного символа в его значение.
4. Почему это работает
По условию каждые две шестнадцатеричные цифры кодируют ровно один ASCII-символ.
Алгоритм обрабатывает строку строго по таким парам, не пропуская и не смешивая символы:
- первая пара восстанавливает первый символ,
- вторая пара — второй,
- и так далее до конца строки.
Для каждой пары вычисляется именно то число, которое она задаёт в шестнадцатеричной системе. После этого это число переводится в символ по таблице ASCII. Так как вход корректный, каждый такой код действительно соответствует печатному символу.
Следовательно, все символы восстанавливаются правильно и в правильном порядке, а значит, получается исходный текст.
5. Сложность
Пусть длина входной строки равна n.
- Время работы:
O(n), потому что строка просматривается один раз. - Дополнительная память:
O(n), если считать память под строку ответа.
6. Код на C++17
#include <iostream>
#include <string>
using namespace std;
int hexValue(char c) {
if ('0' <= c && c <= '9') return c - '0';
return c - 'a' + 10;
}
int main() {
string s;
cin >> s;
string ans;
for (int i = 0; i < (int)s.size(); i += 2) {
int value = hexValue(s[i]) * 16 + hexValue(s[i + 1]);
ans += char(value);
}
cout << ans << '\n';
return 0;
}
7. Код на Python 3
s = input()
result = []
for i in range(0, len(s), 2):
value = int(s[i:i + 2], 16)
result.append(chr(value))
print(''.join(result))
Комментарии