面试题13:数值的整数次方(offer)

题目:

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

思路:
如果将base乘exponent次,时间复杂度为O(n),效率不够高。

由于是同一个数相乘,可以使用前面乘法获得的结果,可以使用二分法来做。

时间复杂度为O(lgn)

边界条件:exponent可能为负值。base可能为0,而exponent为负数。还有0的0次方无意义,需要和面试官说清楚。

#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;

double PowerWithUnsignedExponent(double base,int exponent)
{
	if (exponent == 0) return 1;
	if (exponent == 1) return base;
	double re = PowerWithUnsignedExponent(base, exponent >> 1);
	re *= re;
	if (exponent & 0x1) 
		return  base*re;
	return re;
}

bool equal(double num1, double num2)
{
	if (num1 - num2 > -0.0000001&&num1 - num2 < 0.0000001) return true;
	else return false;
}

double Power(double base, int exponent)
{
	if (equal(base, 0.0) && exponent < 0)
		throw new std::exception("invalid input");
	if (exponent == 0) return 1;
	bool sign = exponent > 0 ? 1 : 0;
	exponent = abs(exponent);
	double re = PowerWithUnsignedExponent(base, exponent);
	return sign?re:1.0/re;
}

int main()
{
	cout << Power(1.1,2) << endl;
	return 0;
}


注意:不能直接判断两个小树是不是相等,因为计算机表示小数(包括float和double型小数)都有误差,我们不能直接用等号判断是否相等。如果两个小数的绝对值差很小,比如小于0.0000001,就可以认为相等。


你可能感兴趣的:(面试题13:数值的整数次方(offer))