Остаток от деления большого числа - Turbo Pascal
Формулировка задачи:
Здравствуйте!
Есть проблема при вычислении остатка от деления.
Нужно вычислить a^b mod t
При этом, например a=226 b=91 t=3827
Были поптытки вычислить сначала a^b, потом от результата mod t. Но a^b не влазит ни в один тип данных. Подскажите пожалуйста, как мне посчитать этот остаток.
Решение задачи: «Остаток от деления большого числа»
textual
Листинг программы
- long a = 1000;
- long b = 1000000000;
- //В начале C присваиваем 1.
- long C = 1;
- while (b > 1) {
- if (b % 2 == 0) {
- //Если степень четная, уменьшаем её в два раза
- b /= 2;
- //при этом возводим в квадрат основание, делим по модулю
- a = (a*a) % t;
- } else {
- //иначе уменьшаем показатель на единицу
- b -= 1;
- //увеличиваем коэффициент перед степенью, делим по модулю
- C = (C*a) % t;
- }
- }
- //теперь показатель степени равен 1
- //значит можно найти по такой формуле
- cout << ((C*a) % t);
Объяснение кода листинга программы
- Переменная
a
инициализируется значением 1000. - Переменная
b
инициализируется значением 1000000000. - Переменная
C
инициализируется значением 1. - Запускается цикл
while
, который будет выполняться до тех пор, покаb
больше 1. - В условии цикла проверяется, является ли
b
четным числом. - Если
b
четное, то оно делится на 2, возводится в квадрат и результат делится по модулю наt
. Значение, полученное по модулю, присваивается переменнойa
. - Если
b
нечетное, то из него вычитается 1, коэффициент перед степенью увеличивается на 1 и результат делится по модулю наt
. Значение, полученное по модулю, присваивается переменнойC
. - По завершении цикла значение переменной
C
будет равно 1. - Выводится значение переменной
C
с помощью функцииcout
. Результат будет равен(C*a)%t
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д