[Вся длинная арифметика]
Операция сложения двух длинных чисел:
- BigInt operator + (const BigInt &a, const BigInt &b)
- {
- BigInt res;
- res.amount = max(a.amount,b.amount);
- int r = 0;
- for (int i=0;i<res.amount | r;i++)
- {
- res.digits[i] = a.digits[i] + b.digits[i] + r;
- if (res.digits[i]>=osn)
- {
- res.digits[i]-=osn;
- r = 1;
- }
- else
- r = 0;
- }
- if (res.digits[res.amount])
- res.amount++;
-
- return res;
- }
* This source code was highlighted with Source Code Highlighter.
В данной реализации отсутствует операция взятия остатка от деления. Вместо этого используется вычитание значения основания системы счисления в строке 11.
P.S: Данная реализация появилась на основе статьи Виталия Гольдштейна с учетом оформления длинных чисел команды HotFinnKeys.
Здесь в 6 строчке
ОтветитьУдалитьi<res.amount | r
тоже же можно использовать логическое "ИЛИ"?
Да, тут точно такая же логика, что и в прошлом случае http://cppalgo.blogspot.com/2010/08/blog-post_9200.html
УдалитьВ 3 строчке: разве BigInt res не должен быть приравнен к a? Получается переменная которой не присвоено значение...
ОтветитьУдалитьВ данном случае можно не присваивать. Вы не правы. Переменной присвоено значение. Для типа BigInt определен конструктор по умолчанию. В данном случае после третей строки в res будет лежать 0
УдалитьЧто проверяется в 17 строчке? Не могу понять..
ОтветитьУдалитьПопробуйте сложить 99 и 1 с использованием этого if'a и без него
УдалитьА что делать если он с этим If 250+500 выводит -858993460750 ?
УдалитьПохоже, что у вас на промежуточных вычислениях произошло переполнение
УдалитьВ 6 строке < заменил на <= и вроде бы все работает.
ОтветитьУдалитьчто такое amount?
ОтветитьУдалитьи это кстати рабоать не будет. компилятор считает,что мы передаем три парметра,а не 2
ОтветитьУдалить