码迷,mamicode.com
首页 > 其他好文 > 详细

幂的运算:X的n次幂

时间:2018-12-02 22:45:16      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:seve   star   result   tar   turn   ret   start   乘法   return   

计算X的n次幂,有多种算法

例子:计算2的62次方。

method 1 :time = 1527 纳秒。

常规思路,进行61次的乘法!

private static long mi(long X, long n) {
		long start = System.nanoTime();
		long result = 1;
		for (long k = 0; k < n; k++) {
			result *= X;
		}
		System.out.println(System.nanoTime()-start);
		return result;
	}

 

method 2 :time = 113 纳秒

进行拆分:2^62 = (2^31)^2 = (2^31)*(2^31)         // 得到 2^31 的值的情况下,需要 1 次乘法

     2^31 = (2^15)^2*2 = (2^15)*(2^15)*2   //  得到 2^15 的值的情况下,需要 2 次乘法

       2^15 = (2^7)^2*2 = (2^7)*(2^7)*2       //  得到 2^7 的值的情况下,需要 2 次乘法

       2^7 = (2^3)^2*2 = (2^3)*(2^3)*2        //  得到2^3 的值的情况下,需要 2 次乘法 

     2^3 = 2*2*2                //  …………………………,需要2次乘法

所以:该方法需   2+2+2+2+1 = 9 次乘法!

     /**
	 * 求x的n次方的值。
	 * 幂函数:
	 * x的n次幂
	 * @param x
	 * @param n
	 * @return
	 */
	public static long pow(long x, long n) {

		long start = System.nanoTime();
		if (n == 0) {
			System.out.println(System.nanoTime()-start);
			return 1;
		}
		// 如果是偶数
		if (isEven(n)) {
			return pow(x * x, n / 2);
		} else {
			return pow(x * x, n / 2) * x;
		}
	}

	/**
	 * 判断x是否是偶数
	 *
	 * @param x
	 * @return
	 */
	private static Boolean isEven(long x) {
		if (x % 2 == 0) {
			return true;
		}
		if (x % 2 == 1) {
			return false;
		}
		return false;
	}

 

幂的运算:X的n次幂

标签:seve   star   result   tar   turn   ret   start   乘法   return   

原文地址:https://www.cnblogs.com/dhcao/p/10055385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!