数值的整数次方
作者:互联网
数值的整数次方
题目链接
题目描述
实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
数据范围: , ,保证最终结果一定满足
进阶:空间复杂度 ,时间复杂度
示例1
输入:
2.00000,3
返回值:
8.00000
示例2
输入:
2.10000,3
返回值:
9.26100
示例3
输入:
2.00000,-2
返回值:
0.25000
说明:
2的-2次方等于1/4=0.25
题目分析
第一种写法(一个数的负次方即为这个数的正次方的倒数)
因为所有数往下除以2最后都能被分解为1和0,所以对于0次幂,返回1,对于1次幂返回base,剩下的就除以二往下分解。
负数次幂就是把base变为1/base,然后-exp次幂即可
public static double power(double base, int exponent) {
return exponent > 0 ? quickPow(base, exponent) : quickPow(1 / base, -exponent);
}
public static double quickPow(double base, int exp) {
if (exp == 0) {
return 1;
}
if (exp == 1) {
return base;
}
return power(base, exp / 2) * power(base, exp - exp / 2);
}
第二种写法(一个数的负次方即为这个数的正次方的倒数)
最直观的解法是将 x 重复乘 n 次,x*x*x...*x,那么时间复杂度为 O(N)。因为乘法是可交换的,所以可以将上述操作拆开成两半 (x*x..*x)* (x*x..*x),两半的计算是一样的,因此只需要计算一次。而且对于新拆开的计算,又可以继续拆开。这就是分治思想,将原问题的规模拆成多个规模较小的子问题,最后子问题的解合并起来。
本题中子问题是 xn/2,在将子问题合并时将子问题的解乘于自身相乘即可。但如果 n 不为偶数,那么拆成两半还会剩下一个 x,在将子问题合并时还需要需要多乘于一个 x。
因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。
public static double Power(double x, int n) {
boolean isNegative = false;
if (n < 0) {
n = -n;
isNegative = true;
}
double res = pow(x, n);
return isNegative ? 1 / res : res;
}
private static double pow(double x, int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return x;
}
//
double res = pow(x, n / 2);
res = res * res;
if (n % 2 != 0) {
res *= x;
}
return res;
}
标签:return,exponent,double,数值,base,整数,res,次方 来源: https://www.cnblogs.com/congratulations/p/15792487.html