【问题标题】:Need explanation about my fibonacci program需要解释我的斐波那契程序
【发布时间】:2014-04-03 19:38:13
【问题描述】:

在我下面的代码中,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;
    }
}

【问题讨论】:

  • 你能更清楚地解释你的问题吗?
  • 当我测试你的 fib 函数时,我得到了这些结果:coliru.stacked-crooked.com/a/ca9428d07e1b8c11。 (有趣的是,这两个都是错误的结果)
  • 解释是“整数溢出”。查一下。
  • sum=a+(2*b); --> sum=b+(2*a);
  • 正如 BLUEPIXY 所指出的,fibnr 正在计算错误的值,因此其结果不会与fibr 的结果相同。 是你的问题吗?请注意,您的帖子中没有一个实际的问题。在 SO 中提出一个好问题(而你的问题非常不好)的第一步是真正做到这一点。

标签: c fibonacci


【解决方案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)。

【讨论】:

  • 字节数和范围取决于您的编译器和架构,但这些结果对于针对 x86 和 x64 的 VC++ 来说是准确的。
  • 问题已经稍微澄清了
猜你喜欢
  • 2015-01-06
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多