数值的整数次方
1. 考虑各种情况 (是一种情况多的题)
// 面试题:数值的整数次方
// 题目:实现函数double Power(double base, int exponent),求base的exponent
// 次方。不得使用库函数,同时不需要考虑大数问题。
考虑全局变量来标志异常
注意不能直接判断 double 类型的数据==0; 是有精度的!!!应该用equal 自己写或者调用c库的,但是C库好像有的时候不能用
bool g_validoutput;//用来标志异常 double Power(double base, int exponent) { g_validoutput=false;//初始值 代表没什么异常!!! if(equal(base, 0.0)&&exponent<0)//0的负多少次方 除数是0,异常 { g_validoutput=true; //代表此处是异常 return 0.0;//并且不耽误输出!! } //每次都输入它 正数的话他不变 unsigned int Exponent=(unsigned int)exponent;//初始化为无符号的exponent if (exponent<0)//次方是负数 Exponent=-exponent;//变成了正的; double result=Powersolve(base,Exponent);//求结果 if (exponent<0)//次方是负数 result=1.0/result; return result; }
//效率低下 double Powersolve(double base, int exponent)//正常情况下的运算 { double result= 1.0; for(int i=1;i<=exponent;i++) { result*=base; } return result; } //类似之前的斐波那契函数里一个计算方式 double Powersolve(double base, unsigned int exponent)//计算base不为0,exponent为非负数情况下的幂值 { if (exponent == 0) return 1; if (exponent == 1) return base; double result = PowerWithUnsignedExponent(base, exponent >> 1);//使用右移作为除2操作,会很快,exponent为正,所以不怕右移 result *= result; if ((exponent & 0x1) == 1)//使用与操作判断是否是奇数,也是一种加速优化操作 result *= base; return result; } bool equal(double num1,double num2)//由于精度原因,不能用==,必须让二者差在一个很小范围内就算相等 { if((num1-num2>-0.000001)&&(num1-num2)<0.000001) return true; else return false; }