您的位置:首页 > 其它

算法:数值的整数次方

2016-05-11 15:02 369 查看
看到这个题目,自以为挺简单的,考察的是我们的细心程度,要思考全面,考虑到数值为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次方的基础上平方,以此类推,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: