数值的整数次方-剑指Offer

数值的整数次方

题目描述

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

思路

  1. 主要有几点需要注意
  • 由于计算机表示小数(float和double)都有误差,不能直接用等号(==)判断两个小数是否相等。若两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等
  • 注意考虑输入值得全面性,正负可能,而且0的负数次幂没意义。

代码

解法一:

public class Solution {
  public double Power(double base, int exponent) {
		if (equal(base, 0.0) && exponent < 0) {
			return 0.0;
		}
		int absExp = exponent;
		if (exponent < 0){
			absExp = -exponent;
		}
		double result = 1.0;
		for (int i = 1; i <= absExp; i++) {
			result *= base;
		}
		if (exponent < 0) {
			result = 1.0 / result;
		}
		return result;
	}
	public boolean equal(double num1, double num2) {
		if ((num1 - num2 > -0.0000001) && (num1 - num2) < 0.0000001) {
			return true;
		} else {
			return false;
		}
	}
}

解法二:

通过递归实现,每次次幂翻倍的乘,可以减少乘法计算的次数,但是注意使用递归前仍然要对输入做必要的检查

public double Power01All(double base, int exponent) {
		if (equal(base, 0.0) && exponent < 0) {
			return 0.0;
		}
		int absExp = exponent;
		if (exponent < 0) {
			absExp = -exponent;
		}
		double result = Power01(base, absExp);
		if (exponent < 0) {
			result = 1 / result;
		}
		return result;
		
	}
	public double Power01(double base, int exponent) {
		if (exponent == 0) {
			return 1;
		}
		if (exponent == 1) {
			return base;
		}
		double result = Power01(base, exponent >> 1);
		result *= result;
		if ((exponent & 0x1) == 1) {
			result *= base;
		}
		return result;
	}
posted @ 2016-06-26 10:16  RosenDing  阅读(157)  评论(0编辑  收藏  举报