Implement pow(x, n).
这里分别用了二分法和五分法,二分法最开始将迭代乘法写在return里,但明显算两遍并不是一个好主意,运行大程序时间上会出错。
#include<iostream>
#include<cmath>
using namespace std;
class Solution {
public:
double pow(double x, int n) {
if(n == 1) return x;
if(n == -1)return 1.0/x;
if(n == 0) return 1;
double t = pow(x,n/2);
if(n%2 == 0)
return t*t;
else
{
if(n>0)
return x*t*t;
else
return t*t;
}
}
double pow5(double x, int n)
{
if (n == 0 || x == 1) return 1;
if (x == 0) return 0;
if (n < 0) x = 1/x;
int a = abs(n);
if (a == 1) return x;
//到了5不加这句会处理不了-1的特殊情况,出现答案错误。
if (x == -1 && n%2 == 0) return 1;
else if (x == -1) return -1;
double t = pow5(x, a/5);
double r = t*t*t*t*t;
if (a%5 == 0) return r;
if (a%5 == 1) return x*r;
if (a%5 == 2) return x*x*r;
if (a%5 == 3) return x*x*x*r;
return x*x*x*x*r;
}
};
int main()
{
Solution so;
double ret = so.pow(0.00001, 2147483647);
cout<<ret<<endl;
}