[water_doubleRapidPow]数值的整数次方

数值的整数次方

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

题目:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0

思路:

还是矩阵快速幂,只是要细分double幂的为0情况为负情况:base==0和!=0, r>0/r<0/r=0;
1.base==0:
              r>0 return0;
              r<0 error;
2.base!=0:
              r>0 return base^r;
              r<0 return 1/base^r;
              r==0 return 1;
普通快速幂版:

class Solution {
public:
    double Power(double base, int exponent) {
        if(base == 0 && exponent > 0)
            return 0;
        if(base == 0 && exponent < 0){
            cout<<"divide 0";
            return 99999999999;
        }
        if(exponent == 0)
            return 1;
        double result = 1;
        int r = exponent;
        while(r){
            if(r % 2){
                result *= base;
            }
            base = base*base;
            r /= 2;
        }
        return exponent>0?result:1/result;
    }
};

递归快速幂(补单base的时机不一样,且base本身也不一样,a^10=a^5 * a^5=(a^2a) * (a^2a),上一版本:a^10=(aa)^5=((aa)(aa))^2 * (aa),补单的是不同阶段的不同a^n)

class Solution {
public:
    double Power(double base, int exponent) {
        if(base == 0 && exponent < 0)
            return 99999999;
        if(base == 0)
            return 0;
       return (exponent < 0)? (1/recurrsion(base, -1*exponent)):recurrsion(base, -1*exponent);
    }
    double recurrsion(double base, int r){
        if(r==1)
            return base;
        if(r==0)
            return 1;
        double subResult = recurrsion(base, r/2);
        subResult = subResult*subResult;
        return (r%2)?subResult*base:subResult;
    }
};
全部评论

相关推荐

12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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