Извините, что мой родной язык не английский.
Домашнее задание касается расчета модуля. Дивиденд настолько велик (a ^ y, a и y может быть 10 ^ 18), поэтому я должен использовать формулу: (m * n)% d = (m% d * n% d)% d, чтобы закончить это.
Итак, моя логика ниже:
если y = 0, вернуть 1% d
если y = 1, вернуть% d
если y чётно, вернуть рекурсив и пусть m = n = a ^ (y / 2)
если y нечетно, вернуть рекурсивную и пусть m = x ^ (y-1) n = a
проблема в том, что если у нечетно, существует два разных способа решения х:
Вы можете увидеть мой код ниже. В ~~ ~~, если заполнить «% d» правильно, а «остаться (1)» неверно.
Но только метод 1 ответ правильный.
При использовании также метода 1 также можно получить правильный ответ. Я все еще хочу знать, почему использование метода 2 неправильно?
Итак, как решить проблему с помощью метода 2? Если можно, как мне изменить код? Не могу, почему?
Я пытался напечатать ответ на любом рекурсиве двумя разными способами. Я вижу, что метод 2, хотя у нечетный, его ответ не так, он может вернуть отрицательное значение.
Это мой код ниже:
#include <stdio.h>
long long int a,i,d;
int remain(long long int y){
if(y==0) return 1%d;
else if(y==1) return a%d;
else if(y%2==0) {long long int temp=remain(y/2); return (temp*temp)%d;}
else if(y%2==1) return ((remain(y-1))*(~~remain(1)~~))%d;
}
int main(void){
scanf("%lld %lld %lld",&a,&i,&d);
printf("%lld\n",remain(i));
return 0;
}
, если ввод 16777215 16777215 23842982
Метод 1, ответ 6647725 (правильный).
Метод 2 ответ: 12467225 (неверно).
Т.А. и я не знаю, почему метод 2 неправильный. Мой ТА предлагает мне задать этот вопрос здесь. Большое спасибо.