面试题15:数值的整数次方

1 题目

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

2 思路

  1. 需要考虑到输入exponent 为负数的情况,可以先对指数求绝对值,算出次方的结果后再取倒数
  2. 当exponent 为负数时,base 不能为0.
  3. 0的0次方,在数学上没有意义,输出0或1都行

3 代码

bool invalidInput= false;
double Power(double base ,int exponent)
{
	if(equal(base,0.0) && exponent<0)
		invalidInput=true;
		return 0.0;
	unsigned int absExponent = (unsigned int)(exponent);
	if(exponent<0)
		absExponent = (unsigned int)(-exponent);
	double result = PowerUnsignedExponent(base,absExponent);
	if(exponent<0)
		result = 1.0/result;
	return result;
}

double PowerUnsignedExponent(double base ,unsigned int exponent)
{
	double result = 1.0;
	for(int i=0;i<exponent;i++)
	{
		result = result*base;
	}
	return result;
}

4 优化

在计算次方的时候,除了简单的遍历,我们可以使用递归的思想,如下公式,来减少计算量
image
可以使用右移运算符代替除以2,用位与运算符代替求余运算符(%)来判断一个数是奇数还是偶数。

double PowerUnsignedExponent(double base, int exponent){
        if(n == 0)
            return 1;
        if(n == 1)
            return base;
        //递归
        double result = PowerUnsignedExponent(base, n>>1);
		//
        result *= result;
		//判断是奇数还是偶数
        if((n & 0x1) == 1)
            result *= base;
        return result;
}
posted @ 2021-03-29 08:58  一地斜阳  阅读(49)  评论(0)    收藏  举报