1. 程式人生 > >【leetcode】50.(Medium )Pow(x,n)

【leetcode】50.(Medium )Pow(x,n)

題目連結


解題思路:
這道題的意思就是求x的n次方。
如果xx求下去,求n-1次,這樣是超時的。
我的思路是,首先求x
x,然後n就可以減少2,然後求(xx)(x*x),這樣n就可以減少4…
就是n不是-1、-1、-1…這樣減下去,而是-2、-4、-8…這樣減下去
迭代cnt次後,可以讓n減少2^(cnt)-1(次)(等比求和),cnt是這麼求的:

int cnt=(int)Math.floor(Math.log(n)/Math.log(2));

然後看n還剩下多少,對n進行遞迴

用一個一位的陣列res(result)來記錄結果的原因是,我想通過calculatePow來改變兩個變數的值,res和n。如果將res設為一個單純的double變數,無法通過子函式改變res的值,只能建立一個數組,然後將res的值的存到數組裡,再將陣列傳遞進入子函式,才能改變這個值。


提交程式碼:

class Solution {
    public double myPow(double x, int n) {
    	if(n==0)    return (double)1;
        if(x==1)    return (double)1;
        if(x==-1){
            if(n%2==0)  return (double)1;
            else return (double)(-1);
        }
        if(n==Integer.MIN_VALUE)	return 0;
        
    	double
res[]=new double[1]; res[0]=1; boolean flag1=n>0?true:false; //判斷是否取倒數 int flag2=(x<0)&&(n%2!=0)?-1:1; n=Math.abs(n); x=Math.abs(x); while(n>1) n=calculatePow(x,n,res); res[0]*=x; if(flag1) return (double
)(flag2*res[0]); else return (double)(flag2*1/res[0]); } public int calculatePow(double x,int n,double[] res) { int fold=1; double base=x; int cnt=(int)Math.floor(Math.log(n)/Math.log(2)); for(int i=0;i<cnt;i++) { res[0]*=base; base*=base; n-=fold; fold*=2; } return n; } }

執行結果:
在這裡插入圖片描述