Код BigNum на с ++

0

Я написал этот код для работы с большим целым числом:
функция sum работает корректно, но множественная функция не работает.
Может ли кто-нибудь помочь мне исправить мою проблему?

  • 0
    В чем проблема? Какие числа он печатает для небольших значений, таких как 2 * 3 и 23 * 45?
  • 0
    например 123 * 123 Это дает 140310 вместо 15129
Показать ещё 1 комментарий
Теги:
math
bignum

1 ответ

1
Лучший ответ

Мне кажется, что вы сначала запоминаете цифры наименьшей значащей цифры. Затем этот последний цикл выглядит так, что он должен перебирать противоположный путь, т.е. От первой - младшей значащей цифры, и добавить ремандер в Mul[i+1] а не Mul[i+1].

for(int i=m;i>0;i--)
{
    if(Mul[i]>9)
    {
        Mul[i-1]+=Mul[i]/10;
        Mul[i]%=10;
    }
}

Однако этого было бы недостаточно, так как даже последняя цифра Mul[m] все еще может быть больше 9, поэтому вам нужно продолжить ее.

Однако ваш код может быть намного проще.

Mul[i+j]+=(Num1[i]*Num2[j]+temp)%10;
temp=(Num1[i]*Num2[j]+temp)/10;

После этого вы, возможно, будете замаскировать Mul[i+j] более 9, поэтому необходимо выполнить (теперь неудачную) пост-обработку. Вы можете изменить это, чтобы взять остаток от всей суммы, поэтому оставляя Mul[i+j] всегда меньше 10.

void mul() {
    int s1 = c1.size(), s2 = c2.size();
    for (i = 0; i < s1; ++i) {
        int temp = 0;
        // note the condition - this ensures the cycle continues past i+s2
        // as long as there is some remainder (assumes same length of Num2 and Mul)
        for (j = 0; j < s2 || temp != 0; ++j) {
            // add the current multiple and the remainder to the digit
            Num[i + j] += Num1[i] * Num2[j] + temp;
            // take the remainder from the whole sum, not only the added part
            // this way Mul[i + j] < 10, therefore you don't need any postprocess
            temp = Mul[i + j] / 10;
            Num[i + j] %= 10;
        }
    }
}

Кроме того, вам не нужно хранить remander в temp, вы можете напрямую добавить его в Mul[i+j+1], в любом случае его будет позаботиться и на следующей итерации.

  • 0
    большое спасибо. это помогло мне

Ещё вопросы

Сообщество Overcoder
Наверх
Меню