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

面试题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

说明:

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

解题思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c++代码

递归法:

class Solution 
{
    
    
public:
    double myPow(double x, int n) 
    {
    
    
    	if(x==0) return 0;
        long num=n;
        if(num==0)
        {
    
    
            return 1;
        }
        if(num<0)
        {
    
    
             x=1/x;
             num=-num;
        }
        return ((num&1)==0 ) ? myPow(x*x, num>>1) : x * myPow(x*x, num>>1);
    }
};

循环法

class Solution 
{
    
    
public:
    double myPow(double x, int n) 
    {
    
    
        if(x==0) return 0;
        long num=n;
        double res=1.0;
        if(num<0)
        {
    
    
            x=1/x;
            num=-num;
        }
        while(num>0)
        {
    
    
            if(num&1) res*=x;
            x*=x;
            num>>=1;
        }
        return res;
    }
};

其实有点小疑问:从上述代码可以看到,该乘的乘法一个都没少,只是少了写循环,减少的时间就是因为循环少了,而不是乘法少了来减少的吗?哪位高人能解答一下我的疑惑~~~

  • 乘法数量是减少了的,数量为log2 n

猜你喜欢

转载自blog.csdn.net/weixin_40162095/article/details/113845202
今日推荐