标签:
实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数的问题。
在写代码的时候要考虑完全各种情况,对于代码的完整性,从三个方面考虑:功能、边界、负面,同时还要考虑对于异常的处理。在这道题中,主要有下面几个方面需要考虑:
(1)底数为0,指数为负,0不能做除数;
(2)底数为0,指数为0,没有意义,要根据实际情况决定为0还是为1;
(3)底数正常,指数为负;
1 #include<iostream> 2 //全局变量,用来标识异常,若底数为0,指数为负,变量值置true 3 bool g_InvalidInput = false; 4 5 //判断浮点数是否相等,计算机表示float和double都有误差,不能直接用==判断 6 bool m_equal(double num1,double num2){ 7 if((num1-num2>-0.0000001)&&(num1-num2<0.0000001)) 8 return true; 9 return false; 10 } 11 12 double PowerWithUnsignedExponent(double base,int exponent){ 13 double result = 1.0; 14 for(int i=1;i<=exponent;i++){ 15 result*=base; 16 } 17 return result; 18 } 19 20 double Power(double base,int exponent){ 21 g_InvalidInput = false; 22 //底数为0,指数为负定为异常 23 if(m_equal(base,0.0)&&exponent<0){ 24 g_InvalidInput = true; 25 return 0.0; 26 } 27 unsigned int unsignedexponent = (unsigned int)exponent; 28 if(exponent<0) 29 unsignedexponent = (unsigned int)(-exponent); 30 31 double result = PowerWithUnsignedExponent(base,unsignedexponent); 32 if(exponent<0) 33 result = 1.0/result; 34 return result; 35 } 36 37 int main(){ 38 double base; 39 int exponent; 40 while(std::cin>>base>>exponent){ 41 std::cout<<Power(base,exponent)<<std::endl; 42 } 43 return 0; 44 }
对于上面的程序,在PowerWithUnsignedExponent函数上还可以做优化,如果exponent为偶数如16,16次方是8的平方,以此类推,用递归实现;如果为奇数,先提出一个base,再做递归。
1 double PowerWithUnsignedExponent(double base,unsigned int exponent){ 2 if(exponent == 0) 3 return 1; 4 else if(exponent == 1) 5 return base; 6 double result = PowerWithUnsignedExponent(base,exponent>>1); 7 result*=result; 8 if(exponent & 0x1 == 1) 9 result*=base; 10 11 return result; 12 }
标签:
原文地址:http://www.cnblogs.com/yangrenzhi/p/5776637.html