剑指offer 面试题16. 数值的整数次方

题目描述

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

题目链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof

朴素解法--思考所有情况

class Solution {
public:
    double myPow(double x, int n) {
        if(n == 0 || x == 1.00) return 1.00;

        int flag = 1;
        if(n < 0){
            n = -n;
           flag = 0;
        }

        double rst = 1.00;
        if(flag){
            for(int i = 0 ; i < n;i ++)
                rst *= x;
        }else{
            for(int i = 0; i < n; i++)
                rst /= x;
        }

        return rst;
    }
};

快速幂解法

$$
因为base * base = base^2
$$

$$
base^2 * base^2 = base^4
$$

$$
同理 base^4 * base^4 = base^8
$$

对于任意的非负指数可拆成二进制指数,例如
$$
base^{11} = base^1 * base^2 * base^8
$$
注:$[11]{十进制} = [1011]$

快速幂模板代码

// int pow(int base,int exp) 
// 快速幂函数,返回 base^exp
// base 底数,exp指数
int pow(int base, int exp){
    int ans = 1;
    while(exp){               
        if(exp & 0x1){
            ans *= base;//如果二进制的最后一位是1,则让ans = ans * base
        }
        
        base *= base;//第一次循环,base=base,第二次base = base^2...
        exp >>= 1;
    }   
    
    return ans;
}

本题解答

class Solution {
public:
    double myPow(double base, int n) {
        double res = 1.0;
        int exp = n;
        while(exp){
            if(exp & 0x01) res *= base;
            base *= base;
            exp /= 2;
        }
        return n>0?res:1.0/res;
    }
};
posted @ 2020-03-30 21:48  syncdoodle  阅读(102)  评论(0编辑  收藏  举报