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

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

一、解题思路

  本题在求base的exponent次方,很多人可能会通过一个for循环将base连乘,但是这样就忽略了exponent的正负和0的情况,以及当exponent为负数的时候,我们知道得到结果是正数的倒数,那么如果结果是0,我们再取倒数就会导致程序出错,因此我们需要分别考虑各种情况。

  另外,当我们求base的32次方的时候,求得base的2次方后,我们就可以求base的4次方,之后就可以求base的8次方;这样求的好处在于减少了乘法操作,通过递归的形式很容易实现。

二、Java代码

public class Solution {
    public double Power(double base, int exponent) {
        //当exponent等于0的时候,任何数的该次方都为1
        if(exponent == 0){
            return 1;
        }
        //当exponent等于1的时候,任何数的该次方都为本身
        if(exponent == 1){
            return base;
        }
        
        boolean isNegative = false;
        //如果exponent为负数,将isNegative设为true
        if(exponent < 0){
            exponent = -exponent;
            isNegative = true;
        }
        //递归调用
        double pow = Power(base * base, exponent / 2);
        //如果exponent为奇数,再乘以一个base
        if(exponent % 2 != 0){
            pow = pow * base;
        }
        return isNegative ? 1 / pow : pow;  //判断标识符
  }
}

三、C++代码

class Solution {
public:
    double Power(double base, int exponent) {
        if(equal(base, 0.0))
        {
            return 0.0;
        }
        
        unsigned int absExponent = 0;
        if(exponent > 0)
        {
            absExponent = (unsigned int)(exponent);
        }
        else
        {
            absExponent = (unsigned int)(-exponent);
        }
        double result = PowerWithUnsignedExponent(base, absExponent);
        
        if(exponent < 0)
        {
            result = 1.0 / result;
        }
        return result;
    }

private:
    bool equal(double num1, double num2)
    {
        if(num1 - num2 > -0.0000001 && (num1 - num2) < 0.0000001)
        {
            return true;
        }
        else{
            return false;
        }
    }
    
    double PowerWithUnsignedExponent(double base, unsigned int exponent)
    {
        if (exponent == 0)
            return 1;
        if (exponent == 1)
            return base;
        //此处用右移运算符代替了除以2
        double result = PowerWithUnsignedExponent(base, exponent >> 1);
        result *= result;
        //用与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数
        if ((exponent & 0x1) == 1)
            result *= base;

        return result;
    }
};

四、Python3代码

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        try:
            result = self.power_value(base, abs(exponent))
            if exponent < 0:
                return 1.0 / result
        except ZeroDivisionError:
            print('Error: base is zero')
        else:
            return result
    def power_value(self, base, exponent):
        if exponent == 0:
            return 1
        if exponent == 1:
            return base
        
        result = self.power_value(base, exponent >> 1)
        result *= result
        if exponent & 1 == 1:
            result *= base
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值