Вы пытаетесь получить представление base-10 (то есть десятичную цифру в каждой ячейке массива). Таким образом, пространство (одно целое на цифру) или время (4 бита на цифру, но накладные расходы на упаковку / распаковку) тратится впустую.
Почему бы не попробовать, например, с base-256, и использовать массив байтов? Или даже база-2 ^ 32 с массивом целых? Операции реализованы так же, как и в Base-10. Единственное, что будет отличаться - это преобразовать число в удобочитаемую строку.
Может работать так:
Предполагая base-256, каждая «цифра» имеет 256 возможных значений, поэтому числа 0–255 - это однозначные значения. Чем 256 пишется как 1: 0 (я буду использовать двоеточие для разделения «цифр», мы не можем использовать буквы, как в base-16), аналог в base-10, как после 9, есть 10.
Аналогично 1030 (база-10) = 4 * 256 + 6 = 4: 6 (база-256).
Также 1020 (база-10) = 3 * 256 + 252 = 3: 252 (база-256) - двузначное число в базе-256.
Теперь давайте предположим, что мы помещаем цифры в массив байтов с наименьшей значащей цифрой первой:
unsigned short digits1[] = { 212, 121 }; // 121 * 256 + 212 = 31188
int len1 = 2;
unsigned short digits2[] = { 202, 20 }; // 20 * 256 + 202 = 5322
int len2 = 2;
Тогда добавление будет происходить так (предупреждение: код блокнота впереди, возможно, не работает):
unsigned short resultdigits[enough length] = { 0 };
int len = len1 > len2 ? len1 : len2; // max of the lengths
int carry = 0;
int i;
for (i = 0; i < len; i++) {
int leftdigit = i < len1 ? digits1[i] : 0;
int rightdigit = i < len2 ? digits2[i] : 0;
int sum = leftdigit + rightdigit + carry;
if (sum > 255) {
carry = 1;
sum -= 256;
} else {
carry = 0;
}
resultdigits[i] = sum;
}
if (carry > 0) {
resultdigits[i] = carry;
}
На первой итерации она должна выглядеть следующим образом:
- сумма = 212 + 202 + 0 = 414
- 414> 256, поэтому нести = 1 и сумма = 414 - 256 = 158
- resultdigits [0] = 158
На второй итерации:
- сумма = 121 + 20 + 1 = 142
- 142 <256, поэтому нести = 0 </li>
- resultdigits [1] = 142
Итак, в конце resultdigits [] = {158, 142}, то есть 142: 158 (base-256) = 142 * 256 + 158 = 36510 (base-10), что в точности равно 31188 + 5322
Обратите внимание, что преобразование этого числа в / из понятной человеку формы ни в коем случае не является тривиальной задачей - оно требует умножения и деления на 10 или 256, и я не могу представить код в качестве образца без надлежащего исследования. Преимущество состоит в том, что операции «сложение», «вычитание» и «умножение» могут быть действительно эффективными, а интенсивное преобразование в / из базы-10 выполняется только один раз в начале и один раз после окончания вычисления.
Сказав все это лично, я бы использовал базу 10 в массиве байтов и не заботился о потере памяти. Это потребует корректировки констант 255 и 256 выше до 9 и 10 соответственно.