h5case什么网站,浙江省杭州市建设厅网站,贵阳网站方舟网络最好,住房与城乡建设厅网站求x的n次方。
思路#xff1a;
第一个想到的思路是x和它自己乘n次#xff0c; 但是这样做会面临一些问题#xff1a; 如果是简单的n很小的情况还好#xff0c;但是可以看到n的取值横跨整个整数范围#xff0c; 如果n非常大#xff0c;一次一次乘x效率低是其一。
一般来… 求x的n次方。
思路
第一个想到的思路是x和它自己乘n次 但是这样做会面临一些问题 如果是简单的n很小的情况还好但是可以看到n的取值横跨整个整数范围 如果n非常大一次一次乘x效率低是其一。
一般来说如果n为负数会先取abs(n), 乘x直至n0后再用1.0/res. 但是你会发现如果n -231, 那么abs(n)会溢出正数范围到-231-1,得到错误的结果。
所以要换个思路。
在网上看到这种方法不错时间复杂度为O(nlogn), 把xn等价于x2 * xn/2, 这样不断地把n分解为n/2. 相当于递归调用myPow函数myPow(x, n) x2 * myPow(x, n/2).
但是你会问如果n不能被2整除怎么办 那就把余数单独拿出来再乘一遍xn x2 * xn/2 * xn%2
如果n为负数呢 在递归到n1或者-1的时候再做处理因为n为负数时也只需要最后做一次1.0/res. n1时就是x本身n-1时就是1.0/x
public double myPow(double x, int n) {if(n 0 || x 1) return 1.0;int nMod2 n % 2;double a 1.0;if(nMod2 1) {a x;} else if(nMod2 -1){a 1.0/x;}return myPow(x*x, n/2)*a;
}