Перегруженный оператор деления для HugeInt

Возможный дубликат:
Отдел с действительно большими числами

Мне нужно перегрузить оператор / для работы с двумя объектами HugeInt, которые определены просто как массив из 30 шортов. Кстати, это домашнее задание, но я уже несколько дней ломаю голову над этой проблемой.

Я уже перегружен оператор *:

HugeInt HugeInt::operator*(const HugeInt &op2){
HugeInt temp;
short placeProducts[hugeIntSize + 1][hugeIntSize] = {0};
short product;
int carry = 0;
int k, leftSize, rightSize, numOfSumRows;

leftSize = getDigitLength();
rightSize = op2.getDigitLength();

if(leftSize <= rightSize) {

numOfSumRows = leftSize;

for(int i = (hugeIntSize - 1), k = 0; k < numOfSumRows; i--, k++) {

for(int j = (hugeIntSize - 1); j >= k; j--) {

product = integer[i] * op2.integer[j] + carry;

if (product > 9) {

carry = product / 10;

product %= 10;

} else {

carry = 0;
}
placeProducts[k][j - k] = product;
}
}

} else {
numOfSumRows = rightSize;

for(int i = (hugeIntSize - 1), k = 0; k < numOfSumRows; i--, k++) {

for(int j = (hugeIntSize - 1); j >= k; j--) {

product = integer[j] * op2.integer[i] + carry;

if (product > 9) {

carry = product / 10;

product %= 10;

} else {

carry = 0;
}
placeProducts[k][j - k] = product;
}
}
}
sumProductsArray(placeProducts, numOfSumRows);

for(int i = 0; i < hugeIntSize; i++)
{
temp.integer[i] = placeProducts[hugeIntSize][i];
}

return temp;}

Но как мне перегрузить / op? Моя главная проблема не с кодом или синтаксисом C ++, а с моим алгоритмом разделения. Когда я умножаю, я могу делать это цифра за цифрой. Я сохраняю каждый продукт (примерно 1-ю цифру нижних раз за каждую цифру выше, а затем 10-значную цифру каждого числа выше, используя мой алгоритм переноса) в моем 2d-массиве. Каждый раз, когда я получаю новый продукт, он смещается влево на n + 1, что «умножает» его на требуемую степень 10. Затем я просто суммирую все столбцы.

Я не могу понять, как кодировать метод длинного деления. Поскольку я имею дело с двумя массивами, он должен быть цифрой за цифрой, и я подозреваю, что это может быть так же просто, как изменить алгоритм умножения. Вложенные циклы и вычитание? Мне нужна переменная для частного и напоминания? Есть ли лучший метод? Мне просто нужно указать в правильном направлении.

5

Решение

В вычислительном делении целых чисел есть несколько интересных результатов:

  • числитель < знаменатель подразумевает частное = 0
  • числитель == знаменатель подразумевает частное = 1
  • числитель> знаменатель, длинное деление будет необходимо для определения отношения.

Первые два условия могут быть выполнены с помощью цикла for. Вы можете перегрузить реляционный оператор меньше и равно, чтобы инкапсулировать это поведение.

Для длинного деления вам понадобится ваш оператор умножения, а также перегруженные операторы «меньше» и «вычитание» и функция члена с добавленной цифрой для выполнения операции.

Это грубая сила, но она должна выполнить работу.

2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector