您的位置:首页 > 其它

数值的整数次方

2016-02-28 11:51 337 查看
【题目】

实现函数double power(double base, int exponent),求base的exponent次方。不得使用库函数,同一时候不须要考虑大数问题。

【分析】

此问题非常easy。可是须要重视下面几种情况:

1. exponent < 0 ,结果为整数次方的倒数。

2. exponent = 0, 结果为1;

3. base = 0 && exponent = 0 。 结果为0。本身基底是0 ,0的0次方没有意义。

4. base = 0 && exponent < 0 , 结果为0。

【測试代码】

#include<stdio.h>

#define false 0;
#define true 1;
int g_Invalid_Input ;

int equal(double num1, double num2)
{
if( (num1-num2>-0.0000001) && (num1-num2<0.0000001) )
return true;
return false;
}
double powerwith_unsigned_exponent(double base, unsigned int exponent)
{
double result = 1.0;
for(int i =1 ; i<= exponent; ++i)
result*=base;

return result;
}

double power(double base, int exponent)
{
g_Invalid_Input = false;

if(equal(base, 0.0) && exponent <=0)
{
g_Invalid_Input  = true;
return 0.0;
}

unsigned int absExponent = (unsigned int )(exponent);
if(exponent < 0)
absExponent = (unsigned int)(-exponent);

double result = powerwith_unsigned_exponent(base, absExponent);
if(exponent < 0)
result = 1.0 / result;

return result;
}

void main()
{
double result1= power(0,0);
double result2 = power( 0 ,-1);
double result3 = power(2,3);
double result4 = power(2,-3);
double result5 = power(-2,3);
printf("power(0,0) =%f \n",result1);
printf("power(0,-1) = %f\n",result2);
printf("power(2,3) = %f\n",result3);
printf("power(2,-3) = %f\n",result4);
printf("power(-2,3) = %f\n",result5);
}


【输出】



【改善】

为了更高效,当指数为偶数时。是能够求出一半的结果,再乘以本身,为奇数时,将偶数结果再乘以一次基底,这样递归算的话效率能达到O(lgn)

double powerwith_unsigned_exponent(double base, unsigned int exponent)
{
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result =  powerwith_unsigned_exponent(base, exponent>>1);
result *= result;
if(exponent & 0x1 ==1)
result *= base;

return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: