为什么我无法正确打印第47个斐波纳契数?

时间:2016-07-11 06:01:00

标签: c fibonacci cs50

我使用64位操作系统,然后我也无法正确打印第46个斐波那契数字,这个数字少于40亿。

#include<cs50.h>
#include<stdio.h>

int main(void)
{  

    unsigned int n=50;
    int array[n];
    array[0]=0;
    array[1]=1;
    printf("%i\n",array[0]);
    printf("%i\n",array[1]);
    for(int i=2;i<n;i++)
    {
        array[i]=array[i-1]+array[i-2];
        printf("%i\n",array[i]);
    }

4 个答案:

答案 0 :(得分:2)

  

我无法正确打印第46个斐波纳契数,这个数字少于40亿。

你很可能超出整数范围,从-4294967296到4294967295.

int array[n];更改为long long array[n];

此外,printf应该从%i更改为%lli

编辑:运行数字时,F(48)的预期值为4807526976,超出整数范围。

答案 1 :(得分:2)

您必须使用long long作为数组的数据类型。因为你要存储整数范围的超范围数。( - 2,147,483,648到2,147,483,647) 并且int i的声明应该在for循环之前。

#include<stdio.h>

int main(void)
{

    int n=50;
    long long array[n];
    array[0]=0;
    array[1]=1;
    printf("%lli\n",array[0]);
    printf("%lli\n",array[1]);
    int i;
    for(i=2;i<n;i++)
    {
        array[i]=array[i-1]+array[i-2];
        printf("%lli\n",array[i]);
    }
}

答案 2 :(得分:1)

使用Rishikesh Raje的计数系统(即第1个Fibonacci是1),其中F(48)是4807526976,那么你无法得到F(47)2971215073因为,正如@kaylum评论的那样,你使用了有符号整数数组来保存您需要更改为无符号的值,以及更改printf语句以打印未签名的值。这将允许您达到32位算术的限制:

#include <stdio.h>

#define LIMIT (50)

int main(void) {
    unsigned int array[LIMIT] = {0, 1};

    printf("%u\n", array[0]);
    printf("%u\n", array[1]);

    for (size_t i = 2; i < LIMIT; i++)
    {
        array[i] = array[i - 1] + array[i - 2];
        printf("%u\n", array[i]);
    }

    return 0;
}

要超越32位,你可以像Rishikesh Raje建议的那样切换到long或long long,但如果你想用给定的位数达到最大结果,可以使用无符号变量。

答案 3 :(得分:0)

使用无符号整数数组或更高值使用无符号long long long数组但是您不需要数组来打印斐波那契数组,您只需执行此操作: -

void main()
{
  unsigned long long i=1, num1=1, num2=0;
  printf("1 \n");
  for(i; i<100 ; i++)
   {
     num1=num1+num2;
     num2=num1-num2;
     printf("%lli \n", num1);
   }
  getch();
 }