面试题16:数值的整数次方

一.题目

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

二.思路

这道题很简单,但是要留意一些细节,比如

  • 底数为0,指数不能为负数(不能对0求倒)
  • 底数、指数均为0,最后结果是1。

在数学里面0^0是未定式;
但在离散里面0^0=1;
在计算机中,规定了0^0=1;

我们可以用如下的公式求a的n次方(快速幂方法)

image

三.代码

//case 1
double power(double base,double exponent){
    
    double result = 1.0;
    for(int i = 1;i <= exponent;++i)
        result *= base;

    return result;
}

//case2
bool g_InvalidInput = fasle;
double power(double base,double exponent){
    
    g_InvalidInput = false;
    if(equal(base,0.0) && exponent < 0){
        g_InvalidInput = true;
        return;
    }

    if(exponent < 0)
        exponent = -exponent;
    unsigned int absExponent = (unsigned int)(exponent);

    double result = PowerWithUnsignedExponent(base,absExponent);
    if(exponent < 0)
        result = 1.0 / result;

    return result;

}
double PowerWithUnsignedExponent(double base,unsigned int exponent){
    double result = 1.0;
    for(int i = 1;i <= exponent;i++)
        result *= base;

    return result;
}

//case3
double PowerWithUnsignedExponent(double base,unsigned int exponent){
    
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;

    double result = PowerWithUnsignedExponent(base,exponent >> 1);
    result *= result;
    if(exponent & 0x1 == 1)
        result *= base;

    return result;
}

四.本题考点

  1. 考查应聘者思维的全面性。这个问题本身不难,但能顺利通过的应聘者不是很多。有很多人会忽略底数为0而指数为负数时的错误处理(这里我们采用了全局变量);
  2. 对效率要求比较高的面试官还会考查应聘者快速做乘方的能力;
原文地址:https://www.cnblogs.com/ovs98/p/9927805.html