【剑指offer】面试题11----数值的整数次方

1、题目描述

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


2、解题思路

做本道题目,需要考虑以下几种问题:

当指数为负数时: 先对指数求绝对值,然后在计算出次方的结果之后再取倒数;

当対0求倒数时: 当底数是0且指数是负数的时候,就会出现对0求倒数从而导致程序运行出错;

0的0次方在数学上是没有意义的:


3、解决方法一

//全局变量,标记是否出现对0求倒数的错误
bool flag = false;

//判断两个double数据是否相等
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){
    double result = 1.0;
    for(int i=0;i<=exponent;++i){
        result *= base;
    }
    return result;
}

double Power(double base,int exponent){
     flag = false;
     //当底数是0且指数是负数的时候,就会出现对0求倒数从而导致程序运行出错
     if(equal(base,0.0) && exponent < 0){
         flag=true;
         return 0.0;
     }
     unsigned int absExponent = (unsigned int)(exponent);

     if(exponent < 0)
         absExponent = (unsigned int)(-exponent);
     double result = PowerWithUnsignedExponent(base,absExponent);
     // 先对指数求绝对值,然后在计算出次方的结果之后再取倒数
     if(exponent < 0)
         result = 1.0/result;
     return result;
 }

4、解决方法二—-更高效

假如求一个数字的32次方,如果已经知道了它的十六次方,则只需要在16次方的基础上再平方一次就可以了。二6次方是8次方的平方,以此类推;

也就是说,可以直接使用以下总结出来的数学公式直接求解:

这里写图片描述

double PowerWithUnsignedExponent(double base,unsigned int exponent){
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;
    double result = PowerWithUnsignedExponent(base,exponent >> 1);
    result *= base;
    if(exponent & 0x1 == 1)
        result *= base;
    return result;
}

猜你喜欢

转载自blog.csdn.net/sofia_m/article/details/81564282
今日推荐