Skip to content

Instantly share code, notes, and snippets.

@gladilindv
Created March 22, 2018 18:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gladilindv/30beb5a9f1a4bbf25b2a3f9ddecd6cac to your computer and use it in GitHub Desktop.
Save gladilindv/30beb5a9f1a4bbf25b2a3f9ddecd6cac to your computer and use it in GitHub Desktop.
const char* sum(const char* a, const char* b) {
int size_a = strlen(a);
int size_b = strlen(b);
int size_max = 0, size_min = 0, temp = 0, max_k = 0, min_k = 0;
const char *p_max, *p_min;
//создаем динамический массив res и копируем в него большую строку
size_max = std::max(size_a, size_b);
size_min = std::min(size_a, size_b);
char *res = new char[size_max + 2]; //резервируем два символа для единицы в начале строки и для конца строки
memset(res, 0, (size_max + 2) * sizeof(char));
if (size_a == size_max) {
p_max = a;
p_min = b;
}
else {
p_max = b;
p_min = a;
}
memcpy(res + 1, p_max, size_max);
//складываем числа с конца двух строк
for (int i = 0; i < size_max + 1; i++) {
max_k = a[size_max - 1 - i] - '0'; //i-ое число с конца строки a
min_k = b[size_min - 1 - i] - '0'; //i-ое число с конца строки b
//проверка на конец строк
if (i >= size_min && !temp)
break;
if (i >= size_min) //если закочилась меньшая строка, зануляем i-ое число с ее конца
min_k = 0;
if (i == size_max) //если закончилась большая строка, зануляем i-ое число с ее конца
max_k = 0;
//складываем данные числа, если сумма больше 9 запоминаем 1 в переменной temp, в следующей итерации прибавляем temp к очередной сумме
res[size_max - i] = (max_k + min_k + temp) % 10 + '0';
temp = (max_k + min_k + temp) / 10;
}
res[size_max + 1] = '\0';
if (res[0] != '1')//если зарезервированный байт для единицы не понадобился сдвигаем строку в начало указателя
memcpy(res, res + 1, size_max + 1);
return res;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment