Как вычесть два больших числа - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь вычесть 2 очень большие целые / большие числа, но я столкнулся с проблемой.Мой код работает для вычитаний, таких как 123 - 94, 5 - 29, но я не могу обойти крайние случаи.Например 13 - 15 должно привести к -2.Но если я наберу num1 - num2 - borrow + 10 на первой цифре, я получу 8, а borrow станет 1. Переходя к последней цифре, я получаю 1 - 1 - borrow(=1), что оставляет мне -1, поэтому мой конечный результат вместо -18быть -2.

Вот мой код для вычитания:


//Infint is the class for the very large number

Infint Infint::sub(Infint other)
{

    string result;

    Infint i1 = *this;
    Infint i2 = other;


    if (int(i1._numberstr.length() - i2._numberstr.length()) < 0)
    {
        Infint(result) = i2 - i1;
        result._numberstr.insert(result._numberstr.begin(), '-');
        return result;
    }

    else if (i1._numberstr.length() - i2._numberstr.length() > 0)
    {
        int diff = i1._numberstr.length() - i2._numberstr.length();
        for (int i = diff; i > 0 ; --i)
        {
            i2._numberstr.insert(i2._numberstr.begin(), '0');
        }
    }


    int borrow = 0;
    int i = i2._numberstr.length() - 1;
    for (; i >= 0 ; --i)
    {
        int sub = (i1._numberstr[i] - '0') - (i2._numberstr[i] - '0') - borrow;

        if (sub < 0)
        {
            sub += 10;
            borrow = 1;
        }

        else
            borrow = 0;

        result.insert(0, to_string(sub));
    }

    while (i > 0)
    {
        result.insert(result.begin(), i1._numberstr[i1._numberstr.length() - i]);
        --i;
    }

    int j = 0;
    while (result[j] == '0')
        j++;

    result.erase(0, j);

    if (borrow == 1)
        result.insert(result.begin(), '-');

    return Infint(result);
}

Не могли бы вы помочь мне понять ошибки или ошибки в логике, которые я сделал?

1 Ответ

0 голосов
/ 08 марта 2019

Так как вы получили 8 в позиции 1 с и -1 в позиции 10 секунд.сумма этих двух равна -10 + 8 = -2, правильный ответ (вместо -10 - 8 = -18, что неверно).

РЕДАКТИРОВАТЬ: Для систематического получения правильного ответа, если вы найдетеразница старших цифр должна быть отрицательной, распределить знак минус по всем цифрам.Предположим, что разностные различия двух n -значных значений равны

a n-1 , ..., a 0

с j будет разница в цифре 10 j , и вы обнаружите, что n-1 <0. Тогда общая разница двух чисел может бытьрассчитывается как </p>

-1 * (-a n-1 * 10 n-1 + ... + -a 0 )

Должно быть достаточно простым получить правильный (отрицательный) ответ, пройдя сумму от 10 n-1 до 1 с.

...