每日演算法 快速冪

2021-07-10 00:20:52 字數 1623 閱讀 4371

實現函式

double power(double base, int n)
求base的n次方,不得使用庫函式,同時不需要考慮大數問題。

問題本身很直觀,但是越簡單的題越需要細心思考,包括邊界問題和效率問題,如果不能考慮到以下3點,就無法給出令人滿意的答案:

考慮n為負數的情況;

考慮base為0的情況;

當n較大時,如何保證效率?

針對上面3個問題,我們逐一解答:

1.在計算的時候,我們統一計算base的 abs(n)次方,最後如果是負數,答案應該取倒數;

2.如果base為0,則它不能做分母,此時若n<0,則我們應該返回錯誤資訊。

關於返回錯誤資訊,一般有以下方法:

在這裡,我們注意到返回值本身可以取任意值,所以不能單純靠返回值;如果僅設定全域性變數,那麼每次計算之後都有檢查,比較麻煩;我們可以選擇返回值+全域性變數的形式來返回錯誤:

如果有錯,返回0,且設定全域性變數。

3.當n較大時,可使用快速冪:

若n為偶數, base^n = base^(n/2) * base^(n/2);

若n為奇數, base^n = base * base^((n-1)/2) * base^((n-1)/2);

下面是power函式:

bool error = false;

double power(double base, int n)

unsigned

int absn = (unsigned

int)n;

if (n < 0)

absn = (unsigned

int)(-n);

double result = powerwithunsignedn(base, absn);

if (n < 0)

result = 1.0/result;

return result;

}

notice:對於小數,判斷是否相等不能直接用 == ,而應該計算兩者的差值在乙個精度範圍內:

bool

equal(int num1, int num2)

下面是核心的快速冪的遞迴版本:

double powerwithunsignedn(double base, unsigned

int n)

一般情況下,以上**已經很完美了~

不過如果你更加追求效率,想必遞迴版本並不能滿足你,那麼可以試一試下面的非遞迴版本:

double powerwithunsignedn(double base, unsigned

int n)

return res;

}

關於快速冪,我們常常用來做快速冪取模等,稍微複雜一點,我們可以用它來做矩陣的快速冪,原理是一樣的,只是操作的物件是乙個矩陣而不是乙個數(矩陣快速冪以求斐波那契數列較為著名,此處暫不展開,後面會開專題寫斐波那契數列,有興趣的讀者可以先自行查詢相關資料)。

每天進步一點點,come on!

(●』◡』●)

本人水平有限,如文章內容有錯漏之處,敬請各位讀者指出,謝謝!

演算法提高快速冪(快速冪演算法詳解)

問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...

快速冪演算法

在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...

快速冪演算法

模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...