大菲波那契數的計算程式

2021-04-13 23:18:17 字數 1007 閱讀 2708

大菲波那契數的計算程式

對於較大的n,由於f[n]已超過計算機字長所能表示的範圍,如何利用計算機來精確地生成的f[n]值呢?例如,當n=100時,f[1000]的值大大超過了無符號長整數所能表示的範圍,很多對程式設計已有相當多經驗的程式設計師對此不知所措。

事實上這一問題的解決非常簡單,設想讓我們用紙和筆來計算f[100],所要做的無非是反覆進行多位數的加法,如果我們將每位數用陣列的乙個單元來表示,乙個菲波那契數用乙個陣列表示,只要設計乙個多位數的加法程式,相應地,將前面計算小菲波那契數的程式加以改造,問題不就解決了嗎?!

為此,定義乙個多位數的結構:

#define radix

10typedef struct tagmpint

mpint;

實現多位數加法的函式為:

void mpintadd(mpint *z, mpint *x, mpint *y)

if (x->length > y->length)

while (i < x->length)

if (x->length < y->length)

while (i < y->length)

if (carry != 0)

z->length = i;

}大菲波那契數的計算程式為:

// file: fibbig.c

#include "mparth.h"

void fibtable()

fclose(fp);

}程式mpadd有很大的改進餘地,該程式的設計完全模擬手工演算過程,用乙個字長存放乙個十進位制位,沒有充分利用計算機的空間資源和計算能力。容易看出,若將基數radix加大,可以加快問題求解的速度。例如,將radix的巨集定義改為

#define radix

10000

不必修改程式,計算速度將加快4倍。當然,radix=256時,可以充分地發揮計算機的時空效能,這時已不需要1000位來存放乙個菲波那契數,但必須將相應的結果轉換為十進位制,以符合自然數的書寫習慣。

菲波那契數的餘數 大數

菲波那契數大家可能都已經很熟悉了 f 1 0 f 2 1 f n f n 1 f n 2 n 2 因此,當需要其除以某個數的餘數時,不妨加一些處理就可以得到。輸入資料為一些整數對p k,p 1 p 5000 表示菲波那契數的序號,k 1 k 15 表示2的冪次方。遇到兩個空格隔開的0時表示結束處理。...

菲波那契數列

菲波那契數列是指這樣的數列 數列的第乙個和第二個數都為1,接下來每個數都等於前面2個數之和。給出乙個正整數k,要求菲波那契數列中第k個數是多少。1 遞迴演算法 include define m 99 int main scanf d k for i 2 i k 1 i printf d n a k ...

菲波那契數列 2

時間限制 1000 ms 記憶體限制 65536 kb 提交數 1990 通過數 661 菲波那契數列是指這樣的數列 數列的第乙個和第二個數都為1,接下來每個數都等於前面2個數之和。給出乙個正整數a,要求菲波那契數列中第a個數對1000取模的結果是多少。第1行是測試資料的組數n,後面跟著n行輸入。每...