题目及测试
package pid050;
import java.util.List;
/* Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。
*/
public class main {
public static void main(String[] args) {
double[] testTable1 ={1.00,2.00,3.0,-6.7};
int[] testTable2 ={7,-2,-2,-3};
for(int i=0;i<testTable1.length;i++){
test(testTable1[i],testTable2[i]);
}
}
private static void test(double ito,int ito2) {
Solution solution = new Solution();
System.out.println(ito+" "+ito2);
long begin = System.currentTimeMillis();
double rtn=solution.myPow(ito,ito2);//执行程序
long end = System.currentTimeMillis();
System.out.println(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(失败,超出时间限制)
简单地进行连续乘法或连续除法,虽然能得到结果,但是如果n过大或者过小,则需要的时间太长
package pid050;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class Solution {
public double myPow(double x, int n) {
if(x==1){
return 1;
}
if(n==0){
return 1;
}
if(n==1){
return x;
}
boolean isPositive=true;
if(n>0){
isPositive=true;
}
else{
isPositive=false;
}
//幂为正
if(isPositive){
double result=1;
for(int i=0;i<n;i++){
result=result*x;
}
return result;
}
//幂为负
else{
double result=1;
for(int i=0;i>n;i--){
result=result/x;
}
return result;
}
}
}
解法2(成功,1ms,极快)
1、n可能为负值,此时需要考虑取绝对值
2、由于n为有符号整型变量,范围为-2147483648~2147483647,取最小值时,如果取绝对值会导致溢出,所以先将负数+1,最后多除一次x。
利用二进制方法,将n用二进制展开,例如求25,其中5=101(2)=1∗22+0∗21+1∗20,故25=21∗22+0∗21+1∗20=51∗22∗50∗21∗51∗20
从上述例子可以看出,可以把n写成二进制,对应位为1时,则乘以当前值,否则不乘;
当前值为x的1,2,4,8。。倍,每次now*now即可
public double myPow(double x, int n) {
if(n==0){
return 1;
}
double result=1;
// 因为负数变成正数有溢出的可能,先将负数+1,最后多除一次x
int pow=n;
if(n<0){
pow=-1-n;
}
// now代表x的2的i次方 的幂的值
double now=x;
for(int i=0;i<31;i++){
// pow在=2^1 + 2^3 + 2^5 类似,可以有2的i次方组成
if((pow&(1<<i))!=0){
result=result*now;
}
now=now*now;
}
if(n<0){
result=result*x;
result=1/result;
}
return result;
}