求m^n%k的算法
(需要用到递归,同余定理以及二分法)
首先,可以将m^n拆分为mmm……m,在对每个m取模后相乘
也就是,
Nmod k=[N1modkN2modkN3modkN4modk……*Nnmodk]modk
对此公式,采用二分法较为高效
递归方法:
#define M 10003
int PowMod(int n, int p)
{
if (p == 1)//递归结束条件
{
return n % M;
}
int temp = Pow(n, p/2);//递归
int result = (temp*temp) % M;//将二分后的两边合并到一起
if (p % 2 == 1)//如果是奇数次幂,则需要再多乘上一个n
{
result = (result*n) % M;
}
return result;
}
或者可以采用非递归:
define M 10003
int PowMod(int n, int p)
{
int result = 1;
while (p > 0)
{
if (p % 2 == 1)
{
result = (result*n) % M;
}
p /= 2;
n = (n*n) % M;
}
return result;