C++题解 | #数值的整数次方#

数值的整数次方

http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00

此题思路简单明了,重点在于:考虑问题的全面性,即要考虑到当底数为0以及指数为0和负数的情况,将其单列出来。
注意点:1.由于计算机储存数据的精度有限,比较两个浮点数是否相等时,不能直接用等于,而是要考虑二者之间的差值,是否小于一个极小的值,若是,则可认为二者相等。
2.考虑到封装性,可以将计算乘方的函数单独列出来。
3.求乘方时,除了可以直接进行n次相乘,还可以考虑从递归的角度出发。鉴于有如下关系:
当n为偶数时,
当n为奇数时,图片说明
即可以将PowerWithUnsigned函数进行递归形式的修改。
当然,也可以使用动态规划代替递归的部分。

class Solution {
public:
    double Power(double base, int exponent) {
        double res = 1.0;
        unsigned int absExponent;
        if (exponent == 0)
            return 1;
        else if (sequal(base, 0.0))
            return 0;
        absExponent = (unsigned int) exponent; 
        if (exponent < 0)
            absExponent = (unsigned int)(-exponent);
        res = PowerWithUnsigned(base, absExponent);
        if (exponent < 0)
            res = 1.0/res;
        return res;
    }
    /*double PowerWithUnsigned(double base, unsigned int exponent) {
        double res = 1.0;
        while (exponent --) {
            res = res * base;
        }
        return res;
    }*/
    double PowerWithUnsigned(double base, unsigned int exponent) {
        if (exponent == 0)
            return 1;
        if (exponent == 1)
            return base;
        double res = PowerWithUnsigned(base, exponent >> 1);
        res = res * res;
        if (exponent & 1)
            res = res * base;
        return res;
    }
    bool sequal(double a1, double a2) {
        if ((a1 - a2) > -0.0000001 && (a1 - a2) < -0.0000001)
            return true;
        else
            return false;
    }
};
全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
达芬骐:一个月入门,一年熟悉,三年精通,五年掌握,十年会用
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务