数值的整数次方

来源:互联网 发布:garageband软件下载 编辑:程序博客网 时间:2024/05/17 01:50

题目描述

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

算法:
1、考虑指数可能为负数或0;考虑底数可能为0的情况

2、由于计算机表示小数(包括float 和 double型小数)都有误差,不能直接使用等号判断相等。如果浮点型数差的绝对值很小,可认为相等。

3、乘法可以用左移2代替 n<<2
除法可以用右移2代替 n>>2

4、优化整数次方,32 为 16和16结果相乘,33为16和16相乘再乘以底数一次。每次都是讲指数拆分成一半

an=an/2an/2

这样将时间复杂度降低一半。

class Solution {public:    double Power(double base, int exponent) {        if(DoubleEqule(base,0))            if(exponent == 0)                return 1;            else                return 0;        bool flag = exponent<0;        exponent = abs(exponent);        double result = 1;        /*for (int i = 0; i < exponent; i++)        {            result = result * base;        }*/        result = helper(base,exponent);        if(flag)            result = 1/result;        return result;    }    double helper(double base,int exponent){        if(exponent == 0)            return 1;        if(exponent == 1)            return base;        //将指数每次除2用右移代替,增加效率        double result = helper(base,exponent>>1);        result = result*result;        //将求余符号%用&1代替        if(exponent & 1)            result = result * base;        return result;    }    bool DoubleEqule(double n1,double n2){        if(abs(n1) - abs(n2) < 0.0001)            return true;        else            return false;    }};
0 0