数值的N次方

问题描述:

实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,

同时不需考虑大数问题。

 

思路分析:

要是你秒秒钟想到一个循环搞定估计面试没戏了。要考虑指数为0和负数的情况,如果底数也

为0了?为负数时就是相当于要求正数时的倒数,这是又要考虑分母为0.

 

参考代码:

bool g_inputInvalid = false;

double Power(double base,int exponnet)
{
    g_inputInvalid = false;
    if (Equal(base,0) && exponnet < 0)
    {
        g_inputInvalid = true;
        return 0.0;
    }
    unsigned int abExponent = (unsigned int)(-exponnet);
    if (abExponent < 0)
    {
        abExponent = -abExponent;
    }
    double result = PowerWithUnsignedExponent(base,abExponent);
    if (exponnet < 0)
    {
        result = 1.0/result;
    }
    return result;
}
double PowerWithUnsignedExponent(double base,unsigned int exponnet)
{
    if (exponnet == 0)
    {
        return 1;
    }
    if (exponnet == 1)
    {
        return base;
    }
    double result = PowerWithUnsignedExponent(base,exponnet>>1);//每次求出基数的偶数次方减少循环
    result *=result;//用了一公式a^n = a^(n/2)*a^(n/2) 或者a^n = a^((n-1)/2)*a^((n-1)/2)*a
    if (exponnet &0x1 == 1)//判断指数是偶数还是奇数,奇数要再乘一次底数
    {
        result *= base;
    }
    return result;
}
bool Equal(double nNum1,double nNum2)
{
    if ((nNum1-nNum2 > -0.0000001) && (nNum1-nNum2 < 0.0000001))
    {
        return true;
    }
    else
    {
        return false;
    }
}

 

思考:

一个细节得注意,在判断两个小数是否相等时不能直接用 == 去判断,因为在计算机内表示小数时都有误

差,所以只能判断它们的绝对值是不是在一个很小的范围内。

posted @ 2014-12-13 21:11  阿木木在发呆  阅读(287)  评论(0编辑  收藏  举报