标签:
题目:实现函数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; }
标签:
原文地址:http://www.cnblogs.com/runninglzw/p/4500472.html