指数函数的另外一种实现

一般情况下,指数函数pow(n,m)的一种较为简单的实现为
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 处理之后的情况 下面的图可以 帮助理解一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值