Остаток от деления большого числа - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д