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


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-символа.

Значит, задача сводится к очень прямому действию:

  • разбить строку на пары символов;
  • каждую пару перевести из шестнадцатеричной записи в число;
  • по этому числу получить ASCII-символ;
  • собрать все символы в ответ.

Например, "41" в шестнадцатеричной системе — это 65 в десятичной, а ASCII-код 65 соответствует символу 'A'.


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

Наблюдение 1

Шестнадцатеричная система использует цифры:

  • 09 со значениями 09,
  • af со значениями 1015.

То есть пара символов вроде "4f" означает:

  • первая цифра 4 — это 4,
  • вторая цифра f — это 15,
  • всё число равно 4 * 16 + 15 = 79.
Наблюдение 2

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

Наблюдение 3

Гарантируется, что каждая пара задаёт печатный ASCII-символ, поэтому дополнительно проверять корректность не нужно.


3. Алгоритм

  1. Считать строку s.
  2. Создать пустую строку ответа.
  3. Перебирать s по два символа:
    • взять символы s[i] и s[i + 1];
    • перевести их из шестнадцатеричной записи в число от 0 до 255;
    • преобразовать это число в символ;
    • добавить символ к ответу.
  4. Вывести полученную строку.
Как перевести пару шестнадцатеричных цифр в число

Если есть два символа 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))

Комментарии

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