算法:数值的整数次方

Posted xulu_258

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:数值的整数次方相关的知识,希望对你有一定的参考价值。

看到这个题目,自以为挺简单的,考察的是我们的细心程度,要思考全面,考虑到数值为0,指数为小数的情况,

具体代码如下:

 

//数值的整数次方  不得调用库函数

#include<stdio.h>


//解法一:
double power(double base,unsigned int exponent)

  double result=1.0;
  int i;
  for(i=1;i<=exponent;i++)
     result *= base;
  return result;


int equals(double num1,double num2)

  if((num1-num2>-0.0000001)&&(num1-num2<0.0000001))
	  return 1;
  else
	  return 0;



double exp(double base,int exponent)

  int s;
  double result;
  unsigned int absexponent;
  s=equals(base,0.0);   //判断底数base是否为0,因为是double类型,在计算机内表示小数都有误差
  if( s==1 && exponent<0)    //当base=0且指数小于0的情况,防止对0求倒数的情况
	  return 0.0;
  absexponent= (unsigned int)(exponent);
  if(exponent<0)       //指数为小数的情况
       absexponent=(unsigned int)(-exponent);
  result=power(base,absexponent);
   if(exponent<0)
	   result=1.0/result;
   return result;
   if(exponent>0)
   
       result=power(base,exponent);
	   return result;
   
 

int main()

  double base,result;
  int exponent;
  scanf("%lf,%d",&base,&exponent);
  result=exp(base,exponent);
  printf("%lf\\n",result);
  return 0;

在这个代码中,当判断底数是否为0时,不可以直接用==判断,因为计算机内表示小数(float和double类型)时是存在误差的,判断两个小数相等,我们可以判断两个数差的绝对值是不是在一个很小的范围内即可。

还有一种更高效的方法,用右移运算符代替除以2,用位与运算代替求余运算符,效率比乘除法高。代码如下:

double exp(double base,int exponent)

  double result;
  if(exponent==0)
	  return 1;
  if(exponent==1)
	  return base;
  result=exp(base,exponent>>1);     //用右移代替除以2,提高效率
  result*=result;
  if(exponent& 0x1 ==1)  //用位运算中的与运算代替求余来判断指数为奇数还是偶数
	  result *= base;
  return result;




这种方法是比如我们求一个数的32次方,已经知道了他的16次方,只要在16次方的基础上平方即可,
而16次方有可以在8次方的基础上平方,以此类推,

以上是关于算法:数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章

七周打卡剑指offer《数值的整数次方》

12.数值的整数次方

剑指:数值的整数次方

12 数值的整数次方

剑指offer12数值的整数次方

剑指offer-数值的整数次方