Добавление целых чисел без длинных

Я пишу класс для моделирования больших целых чисел. Я храню свои данные в виде беззнаковых целых в векторном указателе, называемом данными. Эта функция добавляет n к текущему большому целому числу. Что, кажется, замедляет мою работу, так это использование длинных длинных значений. Кто-нибудь из вас знает способ обойти это? В настоящее время я должен сделать длинную сумму, иначе она будет переполнена.

void Integer::u_add(const Integer & n)
{
std::vector<unsigned int> & tRef = *data;
std::vector<unsigned int> & nRef = *n.data;
const int thisSize = tRef.size();
const int nSize = nRef.size();
int carry = 0;
for(int i = 0; i < nSize || carry; ++i)
{
bool readThis = i < thisSize;
long long sum = (readThis ? (long long)tRef[i] + carry : (long long)carry) + (i < nSize ? nRef[i] : 0);
if(readThis)
tRef[i] = sum % BASE; //Base is 2^32
else
tRef.push_back(sum % BASE);
carry = (sum >= BASE ? 1 : 0);
}
}

Также просто интересно, есть ли какая-то польза от использования ссылок на указатели по сравнению с использованием самих указателей? Я имею в виду, должен ли я использовать tRef [i] или (* data) [i] для доступа к данным.

0

Решение

Вместо использования базы 2 ^ 32 используйте базу 2 ^ 30. Тогда, когда вы добавите два значения, наибольшая сумма будет 2 ^ 31-1, которая вписывается в обычный long (подписано или не подписано).

Или, что еще лучше, используйте основание 10 ^ 9 (примерно равное 2 ^ 30), тогда вам не нужно много усилий для печати больших чисел в десятичном формате.


Если вам действительно нужно работать в базе 2 ^ 32, вы можете попробовать kludge, как показано ниже, при условии unsigned ints не выбрасывать исключения переполнения:

sum = term1 + term2
carry = 0
if (sum < term1 || sum < term2)
carry = 1
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]