classSolution { public: doublemyPow(double x, int n){ if (n == 0) return1; if (n < 0) { x = 1 / x; n = -1 * n; } if (n & 1 == 1) { return x * myPow(x, n-1); } else { return myPow(x, n/2) * myPow(x, n/2); } } };
第二版:执行错误
未通过示例:
1.00000 -2147483648 (-1 * n 会超出int)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: doublemyPow(double x, int n){ if (n == 0) return1; if (n < 0) { x = 1 / x; n = -1 * n; } double res = 1; while (n) { if (n & 1) { res *= x; } x *= x; n >>= 1; } return res; } };
classSolution { public: doublemyPow(double x, int n){ if (n == 0) return1; longlong N = n; if (n < 0) { x = 1 / x; N = -1 * N; } double res = 1; while (N) { if (N & 1) { res *= x; } x *= x; N >>= 1; } return res; } };
第四版:递归法,时间要慢很多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: doublemyPow(double x, int n){ if (n == 0) return1; longlong N = n; if (n < 0) { x = 1 / x; N = -1 * N; } if (N & 1 == 1) { return x * myPow(x, N-1); } else { double y = myPow(x, N/2); return y * y; } } };