需要解释我的斐波那契计划

时间:2014-04-03 19:38:14

标签: c fibonacci

在下面的代码中,fibr(n)fibnr(n)各自返回一个int。当n较小时,返回的值是正确的,但当n较大时,结果会溢出,结果不再可靠。如果返回类型仍为int,那么结果准确的n范围是多少?如果返回类型为unsignedlongunsigned longlong longunsigned long long,该怎么办?

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

int fibr (int n ) {    // using recursive method
    if (n==0) return 0 ;
    else if (n==1) return 1;
    else {
        return (fibr(n-1)+2*fibr(n-2));
    }
}

int fibnr (int n ) {
    int a=0;
    int b=1;
    if (n==0) return a;
    else if (n==1) return b;
    else {
        int sum=0 ;
        int i ;
        for (i=2;i<=n;i++) {
            sum=a+(2*b);
            a=b;
            b=sum;
        }
        return sum;
    }
}

1 个答案:

答案 0 :(得分:1)

Type Name             |   Bytes   |     Ranges of Values
-------------------------------------------------------------------
integer               |     4     | –2,147,483,648 to 2,147,483,647
                      |           |
unsigned integer      |     4     | 0 to 4,294,967,295
                      |           |
long integer          |     4     | –2,147,483,648 to 2,147,483,647
                      |           |
unsigned long integer |     4     | 0 to 4,294,967,295
                      |           |
long long             |     8     | –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
                      |           |
unsigned long long    |     8     | 0 to 18,446,744,073,709,551,615

所以你只需要检查“真正的”斐波那契序列,看看你的输出何时超出范围,这取决于你决定选择哪种类型......使用“unsigned long long”类型你可以达到第93位除了你必须采取别的东西之外的序列号。也许是一个可以处理大数字的库,或者你可以切换到双倍(最多1.7e +/- 308)。