首页 > 代码库 > 【剑指offer】数值的整数次方
【剑指offer】数值的整数次方
题目描述:
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
分析描述:
对于实现一个函数,首先要做的就是全面考虑它的参数的全部可能。对于此题中的数值函数,应该考虑的参数有整数、0、负数、浮点型、整型、是不是大数问题等。
如果exponent是负数,则所求的幂函数中,base不能是0。否则就会出现0做除数的问题,对于这种错误,可以通过指定标志的方法给出。如果exponent是负数,应该求base的(-exponent)的幂数的倒数。另外,如果base为0.0,exponent也为0时,没有意义,
int flag = 0;//标志位,如果base和exponent都为0时,设置该位 double power(double base, int exponent) { if(equal(base, 0.0) && exponent < 0){/*此处不能简单的用base == 0.0来比较*/ flag = 1; return 0.0; } unsigned int absexponent = (unsigned int)exponent; if(exponent < 0) absexponent = (unsigned int)(-exponent);/*如果exponent小于零,求它的绝对值*/ double result = PowerWithUnsignedExponent(base, absexponent); if(exponent < 0) result = 1.0 / result; return result; } double PowerWithUnsignedExponent(double base, unsigned int absexponent) { double result = 1.0; int i; for(i = 1; i <= absexponent; ++i) result *= base; return result; } int equal(double num1, double num2) { if((num1 - num2 > -0.0000001) /*比较两个浮点数是否相等的方法*/ &&(num1 - num2) < 0.0000001) return 1;
上面的方法虽然能解决问题,但并不高效。如果exponent比较大,可以用另外一种方法解决:
double PowerWithUnsignedExponent(double base, unsigned int absexponent) { if(absexponent == 0) return 1; if(absexponent == 1) return base; double result = PowerWithUnsignedExponent(base, absexponent >> 1); result * = result; if(absexponent & 0x1 == 1) result *= base; return result; }
总结:上面的第一段程序用到了一种错误处理方法:全局变量法。还有另外两种处务处理方法:返回值法、异常处理法等。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。