剑指offer|数值的整数次方

来源:互联网 发布:sql 注入登录绕过密码 编辑:程序博客网 时间:2024/05/29 07:52

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

思路:
求次方很简单,一个循环连续相乘就可以了。
但是,题目肯定是没那么简单啦,还要考虑输入值的不同情况的处理。

首先考虑 指数exponent。它是一个整数,分为负整数,零和正整数这三种情况。
1. 正整数的时候正常处理就好。
2. 当指数为0的时候。因为除零外任意数的0次方为为1。零的0次方没有意义,所以输出0或1都可以。我是在牛客网刷的,要求是输出1。所以直接在代码的开头判断指数是否为0,如果是则直接输出1,结束函数。
3. 当指数为负数的时候。由于一个数的负指数等于这个数的指数的倒数。所以这时候需要先求指数的绝对值,然后正常计算。最后把结果取倒数。

然后考虑基数base。他是一个double类型的数。它也分为正负零三种情况。然而正负没有什么影响。主要是要判断是否为零。如果为零则直接返回0。这里还要考虑指数是否为负数,因为对0求倒数是错误的。

由于基数base是一个double类型的数,所以判断它是否为0的时候不能直接用==来判断。需要让它跟一个非常小的数进行比较。代码如下。

class Solution {public:    double Power(double base, int exponent) {        if(exponent==0)                return 1;        if(base<0.00001 && base >-0.00001)                return 0;        int exp=abs(exponent);        double result=1;        for(int i=0;i<exp;++i)            result *=base;        if(exponent < 0)            result = 1.0/result;        return result;    }};

进阶:

由于基数的n次方可以表示成下面的形式,因此可以通过递归的形式来计算。


class Solution {public:    double Power(double base, int exponent) {        if(exponent==0)            return 1;        if(base<0.00001 && base >-0.00001)        {            if(exponent<0)             {                throw runtime_error("invalid input");             }                return 0;        }        int unsignedExp=abs(exponent);        double result=PowerUnsigned(base,unsignedExp);        if(exponent<0)            result= 1.0/result;        return result;    }    double PowerUnsigned(double base,int exponent)    {        if(exponent==0)            return 1;        if(exponent ==1)            return base;        double result=PowerUnsigned(base,exponent>>1);        result *=result;        if(exponent &0x1  ==1)            result *=base;        return result;    }};

参考资料

1.剑指offer 何海涛

1 0
原创粉丝点击