【剑指 Offer 学习】【面试题 11 : 数值的整数次方】【思路】

题目:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

 

思路:

  1. 判断底数是否为 0(当两数相差很小时,可以认为相等),指数是否小于 0;
  2. 取指数的绝对值计算整数次方,若指数为负,通过【1 / 当前结果】得到负的整数次方;
  3. 计算整数次方,使用递归的方法:

当 n 为偶数时,a ^ n = a ^ (n / 2) * a ^ (n / 2)

当 n 为奇数时,a ^ n = a ^ (n-1 / 2) * a ^ (n-1 / 2) * a

 

代码:

package 数值的整数次方;

/**
 * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 * @author Administrator
 */
public class Demo {

	public static void main(String[] args) {
		Solution solution = new Solution();
		System.out.println(solution.Power(2, -5));
	}
}

class Solution {
	
	public double Power(double base, int exponent) {
		if (equal(base, 0) && exponent < 0) {
			return 0.0;
		}
		
		int absExponent = exponent;
		if (exponent < 0) {												// 指数为负数时,取绝对值计算
			absExponent = -exponent;
		}
		
		double result = PowerWithUnsignedExponent(base, absExponent);	// 获取整数次方结果值
		if (exponent < 0) {												// 若指数为负时,通过【1 / 当前结果】得到负的整数次方
			result = 1.0 / result;
		}
		
		return result;
	}
	
	/**
	 * 指数非负时的整数次方
	 * @param base
	 * @param exponent
	 */
	public double PowerWithUnsignedExponent (double base, int exponent) {
		
		if (exponent == 0) {		// 任何数的 0 次方都为 1,0 的 0 此方返回 1 或 0 都可以。
			return 1;
		}
		
		if (exponent == 1) {		
			return base;
		}
		
		/**
		 * 求整数次方,使用递归的方法
		 * 当 n 为偶数时,a ^ n = a ^ (n / 2) * a ^ (n / 2)
		 * 当 n 为奇数时,a ^ n = a ^ (n-1 / 2) * a ^ (n-1 / 2) * a
		 */
		double result = PowerWithUnsignedExponent(base, exponent >> 1);	// 递归实现 a^n 
		result *= result;												 
		if ((exponent & 0x01) == 1) {									// 当 n 为奇数时,按位与 0x01 会得到 1
			result *= base;					
		}
		return result;
	}
	
	/**
	 * 两数相差很小时,可以认为相等
	 * @param num1
	 * @param num2
	 */
	public boolean equal(double num1, double num2) {
		if ((num1 - num2) > -0.0000001 && (num1 - num2) < 0.0000001) {		
			return true;
		} else {
			return false;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值