如何打印一个庞大的数字?

时间:2016-11-11 11:55:12

标签: c numbers

我正在尝试编写一个程序来打印Fibonacci数字,例如

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

最后一个数字是前两个数字的总和。

我认为这很容易,但意识到你必须打印一个巨大的数字,如

   117669030460994

超过C中每种可用数字类型的大小(只检查它们,远远超过)。

那么,我怎么能够存储和打印这么大的数字?

2 个答案:

答案 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。您将能够计算数千(甚至数百万)个数字的大型Fibion​​acci数。

请注意,bignum算法难以有效实施。因此,不要重新发明轮子,你会想到的几个简单的算法效率低于现有技术。使用现有的库(通常会使用某些machine instruction,例如 add with carry ,以加快此类操作。)