数值的整数次方

    实现函数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 }

 

posted @ 2016-08-16 15:40  没长大的书生  阅读(183)  评论(0编辑  收藏  举报