MiddleКодИногдаЕщё не отвечали
Сложить два шестнадцатеричных числа, заданных строками
Два hex-числа заданы строками, старший разряд первым, без ведущих нулей и только из символов 0–9 и a–f. Верните их сумму hex-строкой. Пример: sum("fed","13") == "1000".
Требования:
- Сложение столбиком с младшего конца с переносом.
- Обработайте финальный перенос, удлиняющий результат на разряд (напр.
ff + ff).
std::string addHex(const std::string& l, const std::string& r) {
// ваш код здесь
}
Допишите реализацию.
Идите по обеим строкам от последнего символа к первому, переводя hex-цифру в 0–15 и складывая с переносом. Запишите sum % 16 как следующую цифру, держите sum / 16 как перенос. После концов выведите остаток переноса и разверните строку. O(макс. длины).
- ✗Забыть вывести финальный перенос, теряя старшую цифру
ff + ff - ✗Дополнять не с той стороны и сбивать разрядность
- ✗Ошибиться в переводе цифр a–f в значение (сдвиг на 10)
- →Как обобщить это на произвольное основание?
- →Почему обработка с младшего конца нужна для переноса?
Оглавление
Задача
Сложите два hex-числа, заданных строками, столбиком с переносом.
Решение
#include <string>
#include <algorithm>
static int hexVal(char c) { return c <= '9' ? c - '0' : c - 'a' + 10; }
static char hexChar(int v) { return v < 10 ? '0' + v : 'a' + (v - 10); }
std::string addHex(const std::string& l, const std::string& r) {
std::string out;
int i = l.size() - 1, j = r.size() - 1, carry = 0;
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += hexVal(l[i--]);
if (j >= 0) sum += hexVal(r[j--]);
out.push_back(hexChar(sum % 16));
carry = sum / 16;
}
std::reverse(out.begin(), out.end());
return out;
}
Ключевые моменты
- Складываем с младшего конца, держа перенос.
- Финальный перенос даёт новую старшую цифру (
ff + ff). - Собираем результат задом наперёд и разворачиваем.
Оглавление