我正在尝试编写一个程序来打印Fibonacci数字,例如
0 1 1 2 3 5 8 21 ....
最后一个数字是前两个数字的总和。
我认为这很容易,但意识到你必须打印一个巨大的数字,如
117669030460994
超过C中每种可用数字类型的大小(只检查它们,远远超过)。
那么,我怎么能够存储和打印这么大的数字?
答案 0 :(得分:1)
前段时间我写了一个类似的程序,处理斐波那契序列的unsigned long long
个整数。我不确定它有多高效,因为我使用数组来存储数字。
我还使用%I64d
格式说明符来打印巨大的64 bit
整数,因为我使用的是Windows。但我想如果你使用linux然后%llu
就好了。
正如@M Oehm在评论中指出的那样,使用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 :(得分:0)
你想要的是bignums,a.k.a。arbitrary precision arithmetic。有几个库,特别是GMPlib。您将能够计算数千(甚至数百万)个数字的大型Fibionacci数。
请注意,bignum算法难以有效实施。因此,不要重新发明轮子,你会想到的几个简单的算法效率低于现有技术。使用现有的库(通常会使用某些machine instruction,例如 add with carry ,以加快此类操作。)