我試圖寫一個程序,打印Fibonacci數,如如何打印一個龐大的數字?
0 1 1 2 3 5 8 21 ....
最後一個數字是前兩次的總和。
我認爲這很容易,但實現你要打印一個龐大的數字,如
117669030460994
超過用C每一個可用類型的數的大小(只檢查了他們,遠遠超過)。
所以,我怎麼可能能夠存儲和打印這樣大的數字?
我試圖寫一個程序,打印Fibonacci數,如如何打印一個龐大的數字?
0 1 1 2 3 5 8 21 ....
最後一個數字是前兩次的總和。
我認爲這很容易,但實現你要打印一個龐大的數字,如
117669030460994
超過用C每一個可用類型的數的大小(只檢查了他們,遠遠超過)。
所以,我怎麼可能能夠存儲和打印這樣大的數字?
你想要的是大數,亦稱arbitrary precision arithmetic。有幾個庫,特別是GMPlib。您將能夠計算數千(甚至數百萬)數字的大型Fibionacci數字。
注意BIGNUM算術難以有效地落實。所以不要重新發明輪子,你會想到的幾個簡單的算法效率低於現有技術。使用現有的庫(通常會使用一些machine instruction,如加上攜帶加快此類操作)。
我寫了一個類似的計劃在不久前該處理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;
}
這應該是'%llu'(ell-ell)而不是'%11u'(十一),不是嗎?值得一提的是,標準頭文件'
是的,我的壞。我會改變這一點。謝謝。 – RoadRunner
不錯,它工作正常。我將打印語句更改爲「printf(」%llu「,array [i]);」那麼它正確地打印到第94號。自95號以來,一切都是錯誤的。這足夠大了。謝謝 :) – arslan
使用更大的打印機? –
當然,它不會超過'unsigned long long',它允許高達'18446744073709551615'。 –
看:https://gmplib.org/ –