问题描述:
给定一整数K,N,求出啊K的N次方。若两数相乘时间复杂度为O(1),要求整体时间复杂度为O(logN)。
大体思路:
可以将N转化为二进制形式,将K^N转化为K的二进制各项方的结果之积。例如K = 8,N = 70:
N = 64 + 4 + 2 ;8^70 = 8^ 64 * 8 ^4 * 8^2;
可以一次计算8^1,8^2,8^4 .......8^64各项,可以发现后一项是前一项的平方,因此可以将O(N)的时间复杂度降低到O(logN),然后将化简后存在的项相乘即可。
实现代码如下:
public static int selution(int k, int N) {
String bin = Integer.toBinaryString(N);
int result = 1;
int value = k;
for(int i = bin.length() - 1; i >= 0; i--) {
if(bin.charAt(i) == '1') {
result *= value;
}
value *= value;
}
return result;
}