[Вся длинная арифметика]
В завершении обзора задач на длинную арифметику рассмотрим эту интересную задачу. Часто при работе с длинными числами бывает нужно получить не все число целиком, а только несколько последних цифр. В таких задачах даже порой можно обойтись вообще без длинной арифметики.
По условию задачи 1<=N<=1e9 и 1<=P<=100. Таким образом заведем длинное число, которое проинициализируем числом N. Реализуем быстрое возведение в степень. При этом умножение длинных чисел будем осуществлять не целиком, а только до разряда не превышающего P. Изложенная логика представлена ниже:
- BigInt powNmod10powP(int n, int p)
- {
- BigInt res(1);
- BigInt cur = *this;
- P = p;
- while (n)
- {
- if (n&1)
- res = res * cur;
- cur = cur * cur;
- n/=2;
- }
- return res;
- }
- ...
- int BigInt::P;
- BigInt operator * (const BigInt &a, const BigInt &b)
- {
- BigInt res;
- for (int i=0;i<a.amount;i++)
- {
- int r = 0;
- for (int j=0;j<b.amount | r;j++)
- {
- // блокируем просчет более старших разрядов
- // эффект this = this % 10^P
- if (i+j >= BigInt::P)
- break;
-
- res.digits[i+j] += a.digits[i] * b.digits[j] + r;
- r = res.digits[i+j] / osn;
- res.digits[i+j] -= r*osn;
- }
- }
- int pos = a.amount + b.amount;
- while (pos>0 && !res.digits[pos])
- pos--;
- res.amount = pos + 1;
- return res;
- }
* This source code was highlighted with Source Code Highlighter.
Полный исходный код можно посмотреть здесь
Комментариев нет:
Отправить комментарий