Leetcode pow(x,n)

来源:互联网 发布:网络执法官注册码 编辑:程序博客网 时间:2024/05/18 02:00

Implement pow(xn).

思路:维持循环不变量  x^n = result * factor^p = result * (factor * factor)^(p/2)  或者  (result*factor) *  (factor * factor)^(p/2) ,取决于p是偶数还是奇数。

初始值,如果n>=0, factor = x; 否则,factor = 1.0/x; result = 1.0, p = n.

class Solution {public:    double pow(double x, int n){        if(n<0) x = 1.0/x;    double result = 1.0;    while(n){    if(n%2) result *= x;    x = x * x;    n /= 2;    }    return result;    }};

扩展: 

Implement pow(double a, double x)

思路:将指数double x 拆成整数部分和小数部分,小数部分用在零点的Taylor展开处理。

#include <iostream>#include <iomanip>#include <cmath>using namespace std;double power_integer(double a, double x){double result = 1.0;while(x>0.5){double y = floor(x/2);if(2*y<x-0.5){result = result * a;}a = a*a;x = y;}return result;}double power_fraction(double a, double x, int n=1000){double result = 1.0, item = 1.0;double b = x*log(a);if(x>0.0){for(int i=1;i<n;i++){item *= b/i;result += item;}}return result;}double power(double a, double x, int n=1000){if(x<0) return 1.0/power(a,-x,n);return  power_integer(a,floor(x))*power_fraction(a,x-floor(x),n);}int main(){double pi = atan(1)*4;cout<<setprecision(50)<<pow(pi,pi)<<endl;cout<<setprecision(50)<<power(pi,pi)<<endl;return 0;}



0 0