一般情况下,指数函数pow(n,m)的一种较为简单的实现为
此算法理解起来较为复杂,但时间复杂度为 O(logm)
public long myPow(int n, int m){
long value = 1;
while(m>0){
value *= n;
m--;
}
return value;
}
这种算法的时间复杂度为 O(m);
在计算规模较小的情况下,这种算法较为有效,但当规模增大的一定程度时就可以使用下面这种算法
以x21为例
1)x21= x10101 21的二进制即为10101
2)从指数的二进制左边开始,第一个为1 则表示为 y=y*y*x=x (y初始值为1)
3)第二个为0 则 y=y*y =x2
4)第三个为1 则 y=y*y*x=x5
5)第四个为0 则 y=y*y=x10
6)第五个为1 则 y=y*y*x=x21
代码实现
/**
*Apr 14, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.generic;
public class MyPow {
/**
* @param args
*/
public static void main(String[] args) {
int x = 2;
int n = 12;
long value = myPow(x,n);
System.out.println(value);
}
private static long myPow(int x, int n) {
int m;
m = n;
int t = 1;
while(m > 0){
m /= 2;
t *= 2; // 1;
}
m = n;
int y = 1;
while(t>1){
t /= 2;
y *= y;
while(m >= t){
y *= x;
m -= t; // 2;
}
}
return y;
}
}
此算法理解起来较为复杂,但时间复杂度为 O(logm)
该算法中较难理解的事 标记为 1 ,2 两处
1处为 记录m 转换为2进制时 其bit 数 +1 的 值 2处为将最左边的1 处理之后的情况 下面的图可以 帮助理解一下