实现函数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,就可以认为相等。