本文最后更新于:2020年6月28日 下午

题目描述:

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

实现如下:

//方法一:循环
//此题不需要考虑计算后值溢出的情况,即不存在大数情况
//异常情况:
//底数为0时->0.0
//指数为0时->1.0(数学定义)
//指数为负数时,需要考虑先计算指数绝对值的结果,再取倒数
class Solution 
{
public:
	double Power(double base, int exponent)
	{
		//底数为0时,因为base为double类型,所以需要进行范围判断
		if (base - 0 <= 0.0000001 && base - 0 >= -0.0000001) return 0.0;
		if (exponent == 0) return 1.0;//指数为0,return

		double res = base;
		int unsigned_exponent = abs(exponent);//先取绝对值,考虑exp为负
		for (int i = 2; i <= unsigned_exponent; ++i)
		{
			res *= base;
		}
		if (exponent < 0) res = 1.0 / res;//exp为负数时,取res的倒数
		return res;
	}
};

//方法二:递归
//计算的指数若为n,则只需计算指数为(n/2)时的值,用这个值再平方就可以得到指数为n的值
//注意:
//n为奇数时。需要再乘以一个base,因为(n/2)向下取整
//exponent还是先计算为正数的情况,之后再判断是否求倒数
class Solution
{
public:
	double unsignedPower(double base, int exponent)
	{
		if (exponent == 1)//指数为1,return base
			return base;
		else if (exponent == 0)//指数为0,return 1
			return 1;

		double res = unsignedPower(base, exponent >> 1);//右移一位->除2
		res *= res;//再平方,减少运算次数
		if (exponent & 0x1) res *= base;//判断指数是否为奇数,与1异或->模2
		return res;
	}

	double Power(double base, int exponent)
	{
		//判断底数是否为0
		if (base - 0 <= 0.0000001 && base - 0 >= -0.0000001) return 0.0;
		if (exponent == 0) return 1.0; //判断指数是否为0

		if (exponent < 0)
			return 1.0 / unsignedPower(base, abs(exponent));//负指数应求倒数
		else
			return unsignedPower(base, abs(exponent));
	}
};