算法:数值的整数次方

来源:互联网 发布:淘宝店什么产品好卖 编辑:程序博客网 时间:2024/06/05 18:00

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

0 0
原创粉丝点击