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

Why am i not able to print 47th fibonacci number correctly?

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

#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]);
    }

i am not able to print 46th fibonacci number correctly which is less than 4 billion.

您很可能超出了整数范围,即 -4294967296 到 4294967295。

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

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

编辑:在 运行 数字上,您得到 F(48) 的预期值为 4807526976,这超出了整数范围。

使用 Rishikesh Raje 的计数系统(即第一个斐波那契数为 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,但如果您想达到给定位数的最大结果,请使用无符号变体。

你必须使用 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]);
    }
}

要么使用无符号整数数组,要么使用 unsigned 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();
 }