Leetcode-- 数值的整数次方

实现函数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
 

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

思路

来自:Leetcode题解

因为在说之前看过leetcode的题解了,所以就敲了一遍熟悉一下

需要注意的是当指数为最小负数时,如果取正会发生溢出,所以我就将指数的长度扩大,从int的4个字节扩大到long的8个字节

大致思路:

首先得先分析情况,根据题目,底数可正可负可0,指数也一样;

我们得对指数为负数的情况进行判断,如果指数为负数,底数就得取倒数,然后指数取正,同时也得考虑底数为0的情况;

在前面对一些条件进行处理后,便可以进行快速幂了,以x= 2, n= 10为例;

result首先置为1;

第一次循环,指数10为偶数,所以x= x* x= 2* 2= 4, n= 10/ 2= 5,也就是x^10= (x^2)^5;

第二次循环,指数5为奇数,所以result= result* x= result* 4,n= n/ 5= 2,也就是转换成了x^10= x^2* (x^2)^4;

以此类推,直到指数为0.

(因为快速幂是将底数不断的平方,所以得对指数为奇数的时候进行分离处理)

class Solution {
public:
    double myPow(double x, int n) {
        if(x== 0&& n== 0) return 1;
        if(x== 0) return 0;
        
        long nn= n;
        // 判断指数是否为复数
        if(n< 0){
            nn= -nn;
            x= 1/x;
        }

        // 快速幂计算
        double result= 1;
        while(nn> 0){
            if(nn% 2)
                result*= x;
            x*= x;
            nn/= 2;
        }

        return result;
    }
};

 

你可能感兴趣的:(leetcode)