public class A007_快速幂 {
public static void main(String[] args) {
int a = 2;
int n = 15;
long time = System.currentTimeMillis();
int res = pow(a, n);
long now = System.currentTimeMillis() - time;
System.out.println(now + " " + res);
time = System.currentTimeMillis();
res = pow2(a, n);
now = System.currentTimeMillis() - time;
System.out.println(now + " " + res);
}
public static int pow2(int a, int n) {//线性时间的
int res = 1;
for (int i = 0; i < n; i++) {
res *= a;
}
return res;
}
public static int pow(int a, int n) {//快速幂
if (n == 0)
return 1;
int res = a;
int ex = 1;
while ((ex << 1) <= n) {
res = res * res;
ex <<= 1;
}
return res * pow(a, n - ex);
}
}
快速幂就是把要求的部分分开来计算,最后利用递归把他们合在一起
在例中,每一次递归的a值需要保持不变,所以把a的值保存下来,并用res表示当前值,进行运算,ex是指数,ex<<1,就表示在二进制中右移一位,只要ex右移一位,小于并且等于n的时候,就可以继续循环,反之,就退出,然后把得到的值,保存在res中,并且调用递归,递归时,采用原来的a的值,并且把要求的多少次幂的n减掉ex,表示剩下的,还没求的次幂,代入到递归式中,继续运算,如果while循环求完了,那么就会进入if语句,退出递归式,最后就会把整个结果进行运算,然后返回到主函数中进行输出。