это для школы, но я не хочу, чтобы решение в коде, просто общий алгоритм, который я могу реализовать
BigNum
- это кодировка связанного списка со значением знака.целого числа.
Чтобы сложить / вычесть BigNum
, необходимо создать код для сложения / вычитания величины каждого операнда BitB
.
Чтобы добавить величину, достаточно простопройтись по BitB
связанным спискам и сформировать сумму по ходу движения.
// pseudo-code
BitB *BitBAdd(const BitB *a, const BitB *b) {
BitB temp_head = set next member to NULL
BitB *bit_walker = pointer to the head
bool carry = false;
while (a is not end of list, b not end of list, or carry) {
bool abit = get bit from a if not NULL and advance a, else 0
bool bbit = get bit from b if not NULL and advance b, else 0
bit_walker->nbit = malloc(sizeof *(bit_walker->nbit));
check allocation success
advance bit_walker
set bit_walker->nbit members to NULL, abit ^ bbit ^ carry
carry = majority(abit, bbit, carry);
}
return temp_head.nbit;
}
Вычитание величины влечет за собой сначала поиск большего: int BitBCmp(const BitB *a, const BitB *b)
.Код не показан.Функция вычитания BitB *BitBCmp(const BitB *larger, const BitB *smaller)
тогда аналогична BitBAdd()
.Не показано.
Как только BitBAdd()
, BitBCmp()
и BitBSub()
сделаны, тогда можно сделать BigNum_Add()
и BigNum_Sub()
, изучив знаки и назвав различные BitB...()
, как предложено @user3386109.
Побочные эффекты
BitBAdd()
составляет около 20-25% кода, необходимого для выполнения задачи OP.
Отключениеиз наиболее значимых нулевых цифр может быть желательным.Также учтите, что кодирование величины знака может генерировать +0 и -0.