兩種方法求x的n次冪

2021-08-14 09:12:30 字數 1387 閱讀 8635

分析:

在求乙個數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...