数值的整数次方

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; }

 

posted @ 2019-08-19 17:58  高颖1995  阅读(184)  评论(0编辑  收藏  举报