求x的n次方。
思路:
第一个想到的思路是x和它自己乘n次,
但是这样做会面临一些问题:
如果是简单的n很小的情况还好,但是可以看到n的取值横跨整个整数范围,
如果n非常大,一次一次乘x效率低是其一。
一般来说,如果n为负数,会先取abs(n), 乘x直至n=0后,再用1.0/res.
但是你会发现,如果n = -231, 那么abs(n)会溢出(正数范围到-231-1),得到错误的结果。
所以要换个思路。
在网上看到这种方法不错,时间复杂度为O(nlogn),
把xn等价于x2 * xn/2, 这样不断地把n分解为n/2.
相当于递归调用myPow函数,myPow(x, n) = x2 * myPow(x, n/2).
但是你会问如果n不能被2整除怎么办,
那就把余数单独拿出来再乘一遍:xn = x2 * xn/2 * xn%2
如果n为负数呢,
在递归到n=1或者-1的时候再做处理,因为n为负数时也只需要最后做一次1.0/res.
n=1时,就是x本身,n=-1时,就是1.0/x
public double myPow(double x, int n) {if(n == 0 || x == 1) return 1.0;int nMod2 = n % 2;double a = 1.0;if(nMod2 == 1) {a = x;} else if(nMod2 == -1){a = 1.0/x;}return myPow(x*x, n/2)*a;
}