NOIP 基本演算法設計 高精度演算法與快速冪

2022-06-28 02:33:09 字數 1673 閱讀 6082

有的時候,數字會大到連long long(或int64)都不能承受的程度。這時,我們可以用陣列來模擬大數的各種運算。該模擬方法即為高精度演算法。

快速冪即為求解形如an的快速演算法。

ø高精度的儲存

高精度儲存採用陣列儲存每一位的值,並記錄陣列的長度和正負性。一般來講,陣列的下標越小,對應的整數的位越小。對於乙個高精度整數n,用十進位制計數後,其位數為k,每一位的值分別為a[0]~a[k-1],那麼

對於其他進製計數方式,只要改變底數即可。另外的,如果每一位只儲存0~9,就比較浪費空間,而且增加計算複雜度常數。為了降低複雜度常數,就要進行所謂的壓位儲存(即每四位放到乙個數中),其實就是相當於採用10000進製儲存。

ø高精度的四則運算

加法:模擬整數加法的過程,從低位到高位逐位相加,判斷進製即可。需要注意更新結果的位數,另外要注意負數情況。如果都為負,則相加後取負;如果只乙個為負數,將其變成兩數相減的形式。

減法:模擬整數減法的過程,從高位到低位逐位相減,不足從高位補即可。要更新結果的位數,另外要注意結果為負數。

乘法:模擬整數乘法的過程,依次兩兩相乘即可。對於10000進製儲存的壓位高精度,要注意在中間步驟進製,防止溢位。

除法:模擬整數除法的過程,從高位到低位逐位相除,最後可得出商和餘數。在每一位相除的過程中,需要列舉該位的商。對於10000進製儲存的壓位高精度,直接列舉複雜度高,一般採用二分列舉。不過在noip中,高精度除法應用較少。

ø快速冪

一般求解an時,用依次相乘的方法即可,複雜度為o(n),但實際上,如果記錄a0, a1, a2, a4, a8, ... , 的值(其中),就可快速求解an,複雜度為o(log n)。如果直接求解,還需要用到高精度,複雜度會比較高。不過一般涉及到這類問題的題目,都要求計算出的解除以p取餘數的結果。直接對每一步的計算結果取餘數,就可以不用高精度計算。當然,快速冪的計算不僅僅限於計算乙個值的冪,還可以用於遞推下的矩陣計算。 

u高精度演算法中的正負號問題、公升位與降位問題在運算中需要特別注意。

u高精度演算法在編寫是容易出錯,最好能準備一套模板。

u快速冪求解時,應按照題目要求,看是否加入高精度。

例題2-1:斐波那契數列第n項的值

【問題描述】計算斐波那契數列第n (n≤1010) 項的值。由於這個值會很大,只要計算其除以p的餘數即可。

【分析】此題由於n非常大,直接一步步遞推肯定超時,因此,需要利用快速冪的思想。已知斐波那契數列為

例題2-2:2k進製數(noip2006)

基本演算法 高精度計算

五 高精度計算 高精度數的定義 type hp array 1.maxlen of integer 1 高精度加法 procedure plus a,b hp var c hp var i,len integer begin fillchar c,sizeof c 0 if a 0 b 0 then...

高精度演算法

任務 高精度,計算大數乘小數 引數 乘法函式mul引數為 被乘數a,儲存最終結果的ans陣列,乘數b 結果 ans陣列中ans 0 為最高位,以此類推 include include using namespace std void mul char a,char ans,int b 任務 高精度,...

高精度演算法

由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算。實現高精度數值計算,雖然不能利用程式語言提供的基本數值資料型別,但是可以利用字串儲存高精度數,計算的結果同樣儲存在字串中,將高精度數運算轉化為字串運算。以下列舉出高精度數...