【剑指Offer】面试题11:数值的整数次方

整理自剑指Offer


一:题目描述

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


二:解题思路

本题需要注意几个点

1.整数次方包括正数,负数,0

            正数,正常求解

            负数,按照正数求解后,取倒数,注意base为0的情况,分母不能为0

            0:任何数的0次方均为1


2.base=0的情况     exponent整数,返回0    

                              负数抛出异常(或用全局变量表示输出的0是合法的还是异常)

                              0,返回1


3.base是否等于0,不可以直接用base==0(因为float与double都有误差)  如果两个小数差的绝对值小于0.0000001,则认为两数相等


4.除以2,用>>右移运算符 

  判断是否为基数,用&与运算符,可以提高效率


5.优化求幂函数

当n为偶数,a^n =(a^n/2)*(a^n/2)

当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a


三:代码实现

class Solution {
public:
    bool invalidInput=false;  //判断返回的0是异常true,还是正常输出false
    
    //差值绝对值小于0.0000001,认为两数相等
    bool equal(double num1,double num2){
        if(num1-num2>-0.0000001 && num1-num2<0.0000001)
            return true;
        else
            return false;
    }
    
    double PowerCore(double base,int exponent){
        if(exponent==0)
            return 1;
        if(exponent==1)
            return base;
        
        double result=PowerCore(base,exponent>>1);
        result*=result;
        if((exponent&1)==1)
            result*=base;
        return result;
    }
    
    double Power(double base, int exponent) {
    
        if(exponent==0)
            return 1;//任何数的0次方为1
        if(exponent==1)
            return base;//任何数的1次方为其本身
        
        if(equal(base,0)){
            //基数0,幂指数大于0,返回0
            if(exponent>0)
                return 0;
            //基数0,幂指数小于0,程序运行出错
            if(exponent<0){
                invalidInput=true;
                return 0;
            }
        }
        
        int absExponent=exponent;
        if(exponent<0)
            absExponent=-exponent;
        
        double result=PowerCore(base,absExponent>>1); //>>1右移一位相当除以2
        result*=result;
        
        //奇数次方
        if((absExponent & 1)==1) //&1相当于求余%
            	result*=base;
         

        return exponent>0?result:1.0/result;

    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值