从93rd值向上打印Fibonacci数字时,我得到的值不正确

时间:2017-09-03 21:28:50

标签: c

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

int fibonacciSum(int n);

int main(void) {
    int n = 0;
    scanf("%d", &n);
    printf("%d", fibonacciSum(n));
}

int fibonacciSum(int n) {
    if (n <= 1)
        return n;
    uintmax_t previous = 0;
    uintmax_t current  = 1;
    for (int i = 0; i < n - 1; i++) {
         printf("%ju and i %d\n", current, i);    
         uintmax_t tmp_previous = previous;
         previous = current;
         current = tmp_previous + current;
    }
    return current % 10;
}

该程序计算第n个斐波纳契数以及第n个斐波纳契数的最后一位数。在我的情况下,因为我在第92个元素之后得到了错误的值,所以最后一个数字也出错了。我正在使用jdoodle在线应用程序来编译我的C程序。出了什么问题?

2 个答案:

答案 0 :(得分:1)

如果您只对斐波那契数字的最后一位数感兴趣,请以10为模数进行计算:

#include <stdio.h>

int fibonacciSum(int n);

int main(void) {
    int n = 0;
    if (scanf("%d", &n) == 1) {
        printf("%d\n", fibonacciSum(n));
    }
    return 0;
}

int fibonacciSum(int n) {
    if (n <= 1)
        return n;
    int previous = 0;
    int current  = 1;
    for (int i = 1; i < n; i++) {
         printf("fib(%d) % 10 = %d\n", i, current);
         int tmp_previous = previous;
         previous = current;
         current = (tmp_previous + current) % 10;
    }
    return current;
}

如果您还想要完整的数字,则应使用多精度包(也称为bignum),因为Fibonacci数字从第93位开始超过64位。

你可以写一个简单的只处理正数的加法,存储为分配的十进制数字串。接下来的24小时是一个有趣的挑战,我将在这里发布一个简单的程序。

答案 1 :(得分:0)

看起来在这种情况下会出现整数溢出。

作为Steve Summit suggested in comments

fib[93] = 12,200,160,415,121,876,738 = 64 bits
max_uint64 = 18,446,744,073,709,551,615

所以它确定fib[94]会导致int溢出,因为它大于2 64

如果你想要超大号码,可以使用arbitrary-precision arithmetics