2016-11-11 183 views
-1

我試圖寫一個程序,打印Fibonacci數,如如何打印一個龐大的數字?

 0 1 1 2 3 5 8 21 .... 

最後一個數字是前兩次的總和。

我認爲這很容易,但實現你要打印一個龐大的數字,如

117669030460994 

超過用C每一個可用類型的數的大小(只檢查了他們,遠遠超過)。

所以,我怎麼可能能夠存儲和打印這樣大的數字?

+2

使用更大的打印機? –

+1

當然,它不會超過'unsigned long long',它允許高達'18446744073709551615'。 –

+2

看:https://gmplib.org/ –

回答

0

你想要的是大數,亦稱arbitrary precision arithmetic。有幾個庫,特別是GMPlib。您將能夠計算數千(甚至數百萬)數字的大型Fibion​​acci數字。

注意BIGNUM算術難以有效地落實。所以不要重新發明輪子,你會想到的幾個簡單的算法效率低於現有技術。使用現有的庫(通常會使用一些machine instruction,如加上攜帶加快此類操作)。

1

我寫了一個類似的計劃在不久前該處理unsigned long long整數的斐波那契序列。我不確定它是如何有效的,因爲我使用了一個數組來存儲數字。

我還使用了%I64d格式說明打印的巨大64 bit整數,因爲我使用Windows。但我認爲如果你使用linux然後%llu是好的。

正如@M厄姆在評論中指出的那樣,使用uint64_t也是聲明unsigned long long的另一種方式。

這是什麼樣子:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

#define MAX 100 

int 
main(void) { 
    int i, range; 

    unsigned long long array[MAX]; 
    /* or uint64_t from <stdint.h> */ 

    printf("Enter number range: "); 
    if (scanf("%d", &range) != 1) { 
     printf("invalid number\n"); 
     exit(EXIT_FAILURE); 
    } 

    array[0] = 0; 
    array[1] = 1; 

    for (i = 2; i < range; i++) { 
     array[i] = array[i-1] + array[i-2]; 
    } 

    printf("Fibonacci Series is: "); 
    for (i = 0; i < range; i++) { 
     printf("%I64d ", array[i]); 
    } 

    return 0; 
} 
+1

這應該是'%llu'(ell-ell)而不是'%11u'(十一),不是嗎?值得一提的是,標準頭文件''定義了'uint64_t'整數類型,''定義了一個打印宏'PRIu64'。 –

+0

是的,我的壞。我會改變這一點。謝謝。 – RoadRunner

+1

不錯,它工作正常。我將打印語句更改爲「printf(」%llu「,array [i]);」那麼它正確地打印到第94號。自95號以來,一切都是錯誤的。這足夠大了。謝謝 :) – arslan