Изменения

Перейти к: навигация, поиск
Вычитание
Алгоритм не требует дополнительной памяти.
'''function''' getSum(a: '''vector<int>''', b: '''vector<int>'''): '''vector<int>''' carry = 0 i = 0 '''while''' i < max(a.size(),b.size()) || carry '''if''' i == a.size() a.push_back(0) '''if''' i < b.size() a[i] += carry + b[i] '''else''' a[i] += carry carry = a[i] <tex>\geqslant</tex> base '''if''' carry a[i] -= base i++ '''return''' a
=== Вычитание ===
Алгоритм не требует дополнительной памяти.
'''function''' getSub(a: '''vector<int>''', b: '''vector<int>'''): '''vector<int>''' carry = 0 i = 0 '''while''' i < b.size() || carry '''if''' i < b.size() a[i] -= carry + b[i] '''else''' a[i] -= carry carry = a[i] < 0 '''if''' carry a[i] += base i++ '''while''' a.size() > 1 && a.back() == 0 a.pop_back() <font color=green>//Здесь мы после выполнения вычитания удаляем лидирующие нули, чтобы поддерживать предикат о том, что таковые отсутствуют.</font> '''return''' a
=== Умножение длинного на короткое ===
Алгоритм требует <tex>O(n)</tex> памяти, где <tex>n</tex> — длина длинного числа.
'''function''' getCompLongShort(a: '''vector<int>''', b: '''int'''): '''vector<int>''' carry = 0 i = 0 '''while''' i < a.size() || carry '''if''' i == a.size() a.push_back(0) cur = carry + a[i] <tex>\cdot</tex> b; a[i] = cur '''mod''' base carry = cur / base i++ '''return''' a
=== Умножение двух длинных чисел ===
Алгоритм требует <tex>O(n \cdot m)</tex> памяти, где <tex>n, m</tex> — длины чисел <tex>a</tex> и <tex>b</tex>.
'''function''' getCompLongLong(a: '''vector<int>''', b: '''vector<int>'''): '''vector<int>''' carry = 0 i = 0 '''while''' i < a.size() j = 0 '''while''' (j < b.size() || carry) '''if''' j < b.size() cur = c[i + j] + a[i] <tex>\cdot</tex> b[j] + carry '''else''' cur = c[i + j] + carry c[i + j] = cur '''mod''' base carry = cur / base i j++ j i++ '''while''' c.size() > 1 && c.back() == 0 c.pop_back() '''return''' c
=== Деление длинного на короткое ===
Алгоритм не требует дополнительной памяти.
'''function''' getDivLongShort(a: '''vector<int>''', b: '''int'''): '''vector<int>''' carry = 0 i = a.size() - 1 '''while''' i <tex>\geqslant</tex> 0 cur = a[i] + carry <tex>\cdot</tex> base a[i] = cur '''mod''' base carry = cur / base i-- '''while''' a.size() > 1 && a.back() == 0 a.pop_back() '''return''' a
== См. также ==
== Источники информации ==
* [http://e-maxx.ru/algo/big_integer e-maxx: Длинная арифметика]
 
 
[[Категория: Алгоритмы алгебры и теории чисел]]
[[Категория: Теория чисел]]
344
правки

Навигация