大数取余运算(详解)

//(19^3 mod 23)^2 mod 31=25
//a=19 b=3 c=23 d=2 e=31
#include<stdio.h>
long long powMod(int a,int b,int c)
{
int result = 1;
while(b)
{
if(b % 2 == 1) //3%2=1 1%2=1
result = result * a % c;
//1*19%23=19 19*16%23=5


b/= 2; //b=b/2 b=3/2=1(int) b=1/2=0(int) 退出循环
a = a * a % c; //a=a*a%c=16
}
return result; //返回值5
}

int main()
{
int a,b,c,d,e;
int i=1;
printf("输入a,b,c,d,e\n");
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); //a=19 b=3 c=23 d=2 e=31
printf("前半部分余数为:\n");
printf("%d\n",powMod(a,b,c)); //5
printf("总余数为:\n");
printf("%d",powMod(powMod(a,b,c),d,e));
//同理,再此使用powMod函数(a=5,b=2,c=31) 5^2 mod 31=25
//此时不符合b%2==1
//执行b/=2=>b=1 a=a*a%c=5*5%31=25

//1%2=1 result=1*25%31=25
//b/=2 b=0(int)
//a=a*a%c=5*5%31=25
//返回值25
return 0;
}