算法:数值的整数次方
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次方的基础上平方,以此类推,
以上是关于算法:数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章