数值的整数次方

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

注意问题:
1.判断参数:0的0次方非法,0的负数次方非法;
2.当底数不为零,指数为正数时:循环相乘;
3.当底数不为0,指数为负数时:先求指数的绝对值,在循环相乘,最后求倒数即可。

详见下面代码Power函数:
double  Power(double base,int exponent)
{
    try
    {
        //0的负指数乘积不合法
        if(equals(base,0.0)&&exponent<0)
        {
            throw exception("参数不正确!");
        }
        unsigned int exp=(unsigned int)exponent;
        //如果指数是负数,则先转换n为正数,在计算a^n,最后求倒数
        if(exponent<0)
            exp=(unsigned int)(-exponent);
        //求base^exp,exp为正整数
        double result=GetPower(base,exp);
        //如果指数为负数则求倒数
        if(exponent<0)
            result=1/result;
        return result;
    }
    catch(exception e)
    {
        cerr<<e.what()<<endl;
    }
}
//a^n的实现
double GetPower(double base,double exp)
{
    double result=1.0;
    for(int i=0;i<exp;i++)
        result*=base;
    return result;
}
//判断两个double变量是否相等
bool equals(double number1,double number2)
{
    if(number1-number2>-0.00000001&&number1-number2<0.0000001)
        return true;
    else
        return false;
}

还有一种方法求a的n次方:

利用公式:a^n=

{

a^(n/2)*a^(n/2)   n为偶数;

a^[(n-1)/2] *a^[(n-1)/2]*a  n为奇数;

}

详见下面代码中的Power2函数:
//递归实现
double Power2(double base,int exponent)
{
    try
    {
        //0的负指数乘积不合法
        if(equals(base,0.0)&&exponent<=0)
        {
            throw exception("参数不正确!");
        }
        //递归返回条件
        if(exponent==0)
            return 1;
        if(exponent==1)
            return base;
        if(exponent==-1)
            return 1/base;
        double result=Power2(base,exponent>>1);//递归计算n/2次方
        result*=result;//base的exponent次方=(base的exponent/2次方)*(base的exponent/2次方)
        if(exponent&1==1)//指数为奇数时
            result*=base;//base的exponent次方=(base的exponent/2次方)*(base的exponent/2次方)*base
        return result;
    }
    catch(exception e)
    {
        cerr<<e.what()<<endl;
    }
}

测试代码及结果:

int main()
{ 
    cout<<"使用第一种方法:"<<endl;
    cout<<"2^3="<<Power(2,3)<<endl;
    cout<<"0^-3="<<Power(0,-3)<<endl;
    cout<<"2^-3="<<Power(2,-3)<<endl;
    cout<<"使用第二种方法:"<<endl;
    cout<<"-2^3="<<Power2(-2,3)<<endl;
    cout<<"-2^-3="<<Power2(-2,-3)<<endl;
    return 0;
}

 
原文地址:https://www.cnblogs.com/runninglzw/p/4500472.html