分析:
在求乙個數x的n次冪時,可分為偶數和奇數兩種情況來討論,若x為偶數,則x^n=x^n/2 * x^n/2,若果x為奇數,則x^n=x^(n-1)/2 * x^(n-1)/2 * x。它的基準情況(無需遞迴即能解出)很明顯,就是n==0和n==1時,n==0時,則任何數的0次冪均為1,n==1時,任何數的1次冪均為它本身。
有了上述分析後,**就很容易寫出了。
public
class pow
/** 求x得n次冪
*/public
static
long
pow(long x,long n)
if(n==1)
if(x%2==0)else
}}
例子:
求x^5的值
5可以轉成二進位制,即101,5=2^2+2^0。
x^5因此可以寫成x的2^2+2^0次冪。
我們知道乙個數n,剛開始n%2==1的話,說明它轉成二進位制時,最低位為1,否則為0,下面進行n=n/2(n=n>>1)(右移操作);
如果再次進行n%2==1的話,說明此時的最低位為1,否則為0。
綜上利用以上特性
public
class question23
public
static
intpow(int x, int n)
return x;
}}
如果看不懂,不理解就找個例子代入,比如求4^11。
初始值x=4,n=11,s=1。
11的二進位制表示為1011=1x2^3+0x2^2+1x2^1+1x2^0
第一次迴圈,n%2=1條件滿足,s=4的1次方,x=4的2次方,n向右移動一位,即101
第二次迴圈,n%2=1條件滿足,s=4的3次方,x=4的4次方,n繼續向右移動一位,即10
第三次迴圈,n%2=1條件不滿足,s=4的3次方沒變,x=4的8次方,n繼續向右移動一位,即1
第四次迴圈,n%2=1條件滿足,s=4的11次方,此時x=4的16次方,n繼續向右移動一位,即0
n>0條件不滿足,結束迴圈。
看完這個過程,就應該明白了以下:
1011
↑ 101
↑ 10
↑ 1
↑1、x存在根本上是為了獲得箭頭所指的數在原本的數中的位權,因此依次為1,2,4,8
2、s存在根本上是為了求箭頭所指數的和,因此為1,3,11。1101,其它位都為1,只有第三位為0,所以由3直接到11。
(4只是底數,不產生影響)
如果到這還不明白,建議多走幾遍流程,便理解了。
for man is man and master of his fate
求x的N次冪
典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...
求x得平方根得兩種方法
乙個經典得題目是求平方根 見leetcode第69題 題目如下,對於某個浮點數x,求其平方根。方法一 二分法 這種是最簡單的,就是定義乙個最小值0和最大值number,把乙個數取乙個中間值 0 number 2,然後平方,如果平方大於該數值,就把中間值賦給最大值,否者就把中間值賦給最小值,一直迴圈,...
N!的位數兩種方法求解
第一種方法 將n 表示成10的次冪,即n 10 m 則不小於m的最小整數就是 n 的位數,對該式兩邊取對數,有 m log10 n 即 m log10 1 log10 2 log10 3.log10 n 迴圈求和,就能算得m值,該m是n 的精確位數 include include include i...