算法1.首先直接地来设计这个算法:
--------很容易因为数字过大而溢出。
int ans = 1;
for(int i = 1;i<=b;i++) ans = ans * a;
ans = ans % c;
算法2. 根据公式a^b mod c = (a mod c) ^ b mod c
改进为 :
int ans = 1;
a = a % c;
for(int i = 1;i<=b;i++) ans = ans * a % c;
ans = ans % c;
先取模 ,再相乘,最后再取一次模,结果不变,可避免数据溢出,但是时间复杂度没有变。
过大时,容易超时。
算法3 .快速幂 取模。
a^b mod c=(a ^2) ^(b/2) mod c ; b为偶数
a^b mod c= (a ^2) ^ (b/2)*a mod c;b为奇数
int res = 1;
a %= c;
while (b)
{
if (b & 1) //如过b为奇数
res = (res * a) % c;
a = (a * a) % c; //统一对a进行平方
b >>= 1; // b=b/2;
}