算法:数值的整数次方

看到这个题目,自以为挺简单的,考察的是我们的细心程度,要思考全面,考虑到数值为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次方的基础上平方,以此类推,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值