将Fibonacci数存储在数组中(C)

时间:2017-02-16 00:08:53

标签: c

无法让我的程序输出正确的数字。我觉得我犯了一个简单的错误。这是用C语言编写的。

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

int main()
   {
    int n, i;
    int list[n];

    while(1)
    {
       scanf("%d", &n);
       if(n == -1)
    {
        break;
    }
    else
     {
        for(i = 2; i < n; i++)
        {
            list[i] = list[i-1]+list[i-2]; 
        }
        printf("%d %d", i, list[i] );
    }
 }
}

4 个答案:

答案 0 :(得分:2)

(为了简单起见,我将忽略处理输入。)

第一个问题是打开编译器警告。大多数C编译器默认情况下不会给你警告,你必须要求它们。通常通过编译-Wall。一旦我们这样做,就会揭示出基本问题。

test.c:6:14: warning: variable 'n' is uninitialized when used here [-Wuninitialized]
    int list[n];
             ^
test.c:5:10: note: initialize the variable 'n' to silence this warning
    int n, i;
         ^
          = 0
1 warning generated.

int list[n]会立即创建一个大小为n的列表。由于n未初始化,因此它将是垃圾。你可以printf("%d\n", n);看看,它会像1551959272一样。

因此,n需要初始化,或者您需要动态重新分配list n更改。动态分配和重新分配变得复杂,所以让我们把它变成一个静态大小。

所以我们得到了这个。

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

int main() {
    /* Allocate an array of MAX_N integers */
    const int MAX_N = 10;
    int list[MAX_N];

    /* Do Fibonacci */
    for(int i = 2; i < MAX_N; i++) {
        list[i] = list[i-1]+list[i-2]; 
    }

    /* Print each element of the list and its index */
    for( int i = 0; i < MAX_N; i++ ) {
        printf("%d\n", list[i]);
    }
}

运行,但我们只得零(或垃圾)。你的Fibonacci算法有问题。它是f(n) = f(n-1) + f(n-2),初始条件为f(0) = 0f(1) = 1。您没有设置这些初始条件。永远不会初始化list,因此list[0]list[1]将包含该大块内存中的垃圾。

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

int main() {
    /* Allocate an array of MAX_N integers */
    const int MAX_N = 10;
    int list[MAX_N];

    /* Set the initial conditions */
    list[0] = 0;
    list[1] = 1;

    /* Do Fibonacci */
    for(int i = 2; i < MAX_N; i++) {
        list[i] = list[i-1]+list[i-2]; 
    }

    /* Print each element of the list and its index */
    for( int i = 0; i < MAX_N; i++ ) {
        printf("%d\n", list[i]);
    }
}

现在可行。

0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34

答案 1 :(得分:0)

主要功能没有返回。

必须先定义

n。否则它从内存中获取随机值。 因此,您的列表数组创建的值未知。

int list[n];

此外,这将永远不会发生,因为声明了n,但未定义。

i < n;

这是你需要的吗?

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

int main()
{
    int F[100];
    F[0] = 0;
    F[1] = 1;
    int i = 2;
    while(1)
    {
        if(i < 100)
        {
            F[i] = F[i-1] + F[i-2];
            i++;
        }
        else
        {
            break;
        }
    }
    i = 0;
    while(1)
    {
        if(i < 100)
        {
            printf("%d ; ", F[i]);
            i++;
        }
        else
        {
            break;
        }
    }
    return 0;
}

答案 2 :(得分:0)

以下是代码段

#include <stdio.h>
int main()
{
    int MAX_SIZE = 100; //Initial value
    int n, i;
    int list[MAX_SIZE];

    printf("Enter value of 'n'");
    scanf("%d",&n);

    if(n < 0){
       printf("'n' cannot be negative number");
       return 0;
    }else if (n==1){
       list[0]=0;
    }else if(n == 2){
       list[0]=0;
       list[1]=1;
    }else{
        list[0]=0;
        list[1]=1;
        for(i = 2; i <= n; i++)
        {
          list[i] = list[i-1]+list[i-2]; 
        }
    }
    //To view array elements
    for(int i=0;i<n;i++){
        printf("%3d",list[i]);
    }

   }

答案 3 :(得分:0)

您需要为每次迭代按需分配内存。在你的代码中,n是未经初始化的,这导致了不可遏制的行为。此外,您需要初始化list[0]list[1],因为这是“基本”案例。

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

int main()
{
  int n, i;
  int* list; /* Declare a pointer to the list */

  while(1)
  {
     scanf("%d", &n);
     if(n == -1)
     {
       break;
     }
     else if ( n > 0 )
     {
       list = (int *) malloc( n * sizeof(int) );
       list[0] = 1;
       list[1] = 1;
       for(i = 2; i < n; i++)
       {
         list[i] = list[i-1]+list[i-2]; 
       }
       printf("%d %d\n", i, list[i-1] );
       free(list);
     }
   }
}