【剑指offer】数值的整数次方

数值的整数次方

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

很经典的快速幂算法,当时学的时候真是一头雾水啊难啊,不过现在看来都是菜菜,哈哈哈~

// 看offer书,突然想到一个学习快速幂算法的思路:先看书上的公式,试着递归求解,递归求解思路还是很清晰的,最最后试着看递推思路。(一上来学递推思路有点吃力)

// 递推写法
public class Solution {
    public static double Power(double base, int exp) {

        boolean flag = false;
        if (exp < 0) {
            flag = true;
            exp = -exp;
        }
        double ans = 1;
        while (exp > 0) {
            if ((exp & 1) == 1) {
                ans = ans * base;
            }
            exp >>= 1;
            base *= base;
        }
        return flag ? 1 / ans : ans;
    }
}

我竟然没写过递归的快速幂算法,成功get到新技能~

// 递归写法
public class Solution {
    public static double Power(double base, int exp) {
        boolean flag = exp < 0;
        if (flag) {
            exp = -exp;
        }
        double result = getPower(base, exp);
        return flag ? 1 / result : result;
    }

    public static double getPower(double base, int exp) {
        if (exp == 0) {
            return 1;
        }
        if (exp == 1) {
            return base;
        }
        double ans = getPower(base, exp >> 1);
        ans *= ans;
        if ((exp & 1) == 1) {
            ans *= base;
        }
        return ans;
    }
}
全部评论
return Math.pow(base,exponent); 这样不行吗? 我人蒙了
1 回复 分享
发布于 2019-10-16 20:21
请问一下 exp >> 1 是什么意思啊?为什么根据这个来递归或者循环?
1 回复 分享
发布于 2019-10-13 19:02
请问大佬为什么要加入 exp >>= 1; 这句代码?怎么想到的呢?
点赞 回复 分享
发布于 2020-09-06 15:32
请问一下,这样的递归写法可以吗? class Solution { public: double Power(double base, int exponent) { int e = exponent; if (e < 0) { e = -e; base = 1 / base; } if (e == 1) { return base; } else if (e == 0) { return 1; } if (e & 1) { return base * Power(base * base, e >> 1); } else { return Power(base * base, e >> 1); } } };
点赞 回复 分享
发布于 2020-01-21 02:08

相关推荐

评论
22
5
分享

创作者周榜

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