我們接觸冪運算都是來自於那個著名的傳說——國王的公尺粒棋盤遊戲。在這個傳說裡,最為核心的就是越往後計算量越大。所以,在求解冪運算的時候,降低時間複雜度就很關鍵。
本文主要採用了快速冪演算法和位運算來進行優化。
如果採用傳統的的逐項相乘的方法,雖然可以通過算例,但是時間複雜度為o(n)。
double
power
(double base,
int exponent)
else
if(exponent <0)
return result;
}
耗時3ms,記憶體占用592k。
快速冪執行就是通過增大底數來縮小指數的方法。例如求10的100次方,可以寫為100的50次方,那麼100次迴圈就降為了50次。所以快速冪演算法的時間複雜度為o(logn)。
進一步的,在取餘和除以2的時候,可以使用位運算來代替。
取餘即為與1相與,1是000…1,相與結果即為最後一位。與2相除即為右移一位,而且還是整數除法,因為最後一位的1會被捨去。
double result=1;
if(base==0)
return0;
else
if(exponent ==0)
return result;
else
if(exponent >0)
}else
if(exponent <0)
result =
1.0/result ;
}return result;
**中在指數取余為1時,結果才會與底數相乘,不過顯然迴圈的最後一步指數一定是1,所以最後前n項積一定會與底數相乘。 劍指Offer(五) 位運算
寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。位運算 coding utf 8 class solution def add self,num1,num2 write code here a,b num1,num2 while b 0 a,b a b,a b 1 a 0xffff...
劍指offer 孩子們的遊戲
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...
劍指 offer 孩子們的遊戲
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...