1. 原理:

如图,任意一个正整数都可以表示成数个2的n次方之和。所以如a^105 = a*(a^8)(a^32)(a^64)

而a^(2^n)运算可以利用a^(2^n/2)的运算结果,总之a^(2^n)运算量非常小。

从而可以快速的对所求数进行幂运算

2. 伪代码:

function BINEXP(a, n) r = 1 //初始化 while n!=0 if n & 1 == 1 //取遍历数2^n二进制最后一位判断。&为按位与运算。 r = r * a //乘上所有拆分项计算结果 a = a * a //配合n的遍历次数来计算a^(2^n) n = n>>1//遍历2的2到n次方 return r

3. C语言代码实现:

long long BINEXP(long long a, int n) {  
long long r = 1;  
for (; n != 0;) {  
if (n & 1 == 1) {//取遍历数2^n二进制最后一位判断。&为按位与运算。  
r = r * a;//乘上所有拆分项计算结果  
}  
a = a * a;//配合n的遍历次数来计算a^(2^n)  
n = n >> 1;//遍历2的2到n次方  
}  
return r;  
}

注意,输出long long类型的格式符为%lld

4. C语言快速幂取模代码:

int BINEXP(int a, int n, int m) {
a = a % m; //初始化对第一个拆分项取模  
int r = 1;  
for (; n != 0;) {  
if (n & 1 == 1) {//取遍历数2^n二进制最后一位判断。&为按位与运算。  
r = (r * a) % m; //保证最后结果再取模  
}  
a = (a * a) % m; //对每个可能拆分项都取模    
n = n >> 1;//遍历2的2到n次方  
}  
return r;  
}