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

来源:互联网 发布:linux 怎么写shell脚本 编辑:程序博客网 时间:2024/05/21 10:45

题目描述:

给定一个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));    }};
0 0
原创粉丝点击