您的位置:首页 > 其它

LintCode_Pow(x, n)

2015-12-04 12:20 274 查看
问题描述:






算法设计:要特别注意n可为正,也可为负数

方法一:直观上,最简单的方法就是:根据参数n直接遍历循环,但是遍历次数多,时间长;

public static double myPow(double x, int n) {
if(x==0){
return 0;
}

if(x==1){
return 1;
}

if(n==0){
return 1;
}

if(n==1){
return x;
}

if(n==-1){
return 1/x;
}

double result=x;
if(n>1){
for(int i=1;i<n;i++){
result=result*x;
}
return result;
}

if(n<-1){
int k=n*(-1);
for(int i=1;i<k;i++){
result=result*x;
}
}
return 1/result;
}


方法二:结合二分法和递归来做:

public static double myPow2(double x, int n) {
if(x==0){
return 0;
}

if(x==1){
return 1;
}

if(n==0){
return 1;
}

if(n==1){
return x;
}

if(n==-1){
return 1/x;
}

double result=1;

int k=0;

if(n>1){
k=n;
}else{
k=n*(-1);
}

if(k%2==0){
result=myPow2(x,k/2);
result=result*result;
}else{
result=myPow2(x,(k-1)/2);
result=result*result*x;
}

if(n<0){
result=1/result;
}

return result;
}
注,在写这个题的时候,想到一个利用二分法求n次开方的算法

public static double mySqur(double x,int n){

if(x==0){
return 0;
}

if(x==1){
return 1;
}

if(n==1){
return x;
}

double result=0.00001;
double left=0;
double right=x;
while(result>0){
//二分法求解;
result=(left+right)/2;
System.out.println("result-->"+result);
double y=result;
int k=0;
if(n>1){
k=n;
}else{
k=n*(-1);
}

for(int j=1;j<k;j++){
y=y*result;
}
System.out.println("y-->"+y);

if(y<x-0.001){
left=result;
}else if(y>x+0.001){
right=result;
}else{
break;
}

}
if(n<0){
result=1/result;
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: