Implement pow(x, n), which calculates x raised to the power n (xn).
static double recPow(double x, unsigned int n) {
if (n == 0) return 1; // x^0 = 1; x!=0
if (n == 1) return x;
double res = recPow(x, n >> 1);
res *= res;
if (n & 0X1) return res*x;
else return res;
}
double myPow(double x, int n) {
// Raising 0 to a negative exponent is undefined,
// but in some circumstances, it may be interpreted as infinity (∞).
// So, we return 0.0
// 0^0 we also retur 0.0
if ( x > -1e-8 && x < 1e-8 && n <= 0)
return 0.0;
int inverse = 0;
if (n < 0) {
inverse = 1;
n = -n - 1; // Prevent int overflow
}
double res = recPow(x, n);
if (inverse) {
res *= x;
res = 1 / res;
}
return res;
}
69. Sqrt(x)
Implement int sqrt(int x)
.
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
int mySqrt(int x){
if (x < 2) return x;
int left = 1;
int right = x / 2;
int last_mid;
while (left <= right) {
int mid = (left + right) / 2; // prevent overflow
if (x / mid > mid) { //use / instead of * prevent overflow
last_mid = mid;
left = mid + 1;
} else if (x / mid < mid){
right = mid - 1;
} else {
return mid;
}
}
return last_mid;
}
int mySqrt(int x) {
if (x < 2) return x;
int left = 1;
int right = INT_MAX;
while (1) {
int mid = left + (right - left) / 2;
if (x / mid < mid) {
right = mid - 1;
} else {
if (x / (mid + 1) < mid + 1)
return mid;
left = mid + 1;
}
}
}