使用快速幂的迭代来实现,原理讲解
https://blog.csdn.net/Harington/article/details/87602682
代码实现:
package com.likou;
/**
* 数值的整数次方:不可能是循环n次,因为会超时的。
* 快速幂
* 快速幂的迭代写法
*/
public class shuZhiZhengShuCiFang {
public static void main(String[] args) {
double x = 2;
int n = 2;
double result = myPow(x,n);
System.out.println(result);
}
/**
*
* @param x 底数
* @param n 幂
* @return
*/
public static double myPow(double x, int n) {
long N = n;
if(n < 0) { // 将负的统一为正的
N = -N;
x = 1/x;
}
return fastPow(x, N); //快速幂的迭代写法
}
private static double fastPow(double x, long n) { // 2 3
if(n==0) return 1;
double res = 1; // 累积值初始化为1
while(n > 0) {
if((n & 1) == 1){ // 将n变成二进制,然后去与运算,如果是1的哈。累积结果值
res *= x; // 如果是1,那么结果乘底数
}
x *= x; // 底数会翻倍,这样就可以减少循环次数;每向右移动一位,底数会加倍
n >>= 1; // 往右移
}
return res;
}
}