您的位置:首页 > Web前端

剑指Offer——(12)数值的整数次方

2017-05-04 17:14 363 查看
题目描述:

给定一个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));
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息