Tursko
Tursko

Reputation: 132

Storing Fibonacci numbers in an array (C)

Can't get my program to output the correct number. I feel like I am making a simple mistake. This is written in 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] );
    }
 }
}

Upvotes: 0

Views: 6437

Answers (4)

Schwern
Schwern

Reputation: 164829

(To make things simpler, I'm going to ignore dealing with input.)

First problem is turning on compiler warnings. Most C compilers don't give you warnings by default, you have to ask for them. Usually by compiling with -Wall. Once we do that, the basic problem is revealed.

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] immediately creates a list of size n. Since n is uninitialized it will be garbage. You can printf("%d\n", n); and see, it'll be something like 1551959272.

So either n needs to be initialized, or you need to reallocate list dynamically as n changes. Dynamic allocation and reallocation gets complicated, so let's just make it a static size.

So we get this.

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

That runs, but we get nothing but zeros (or garbage). You have a problem with your Fibonacci algorithm. It's f(n) = f(n-1) + f(n-2) with the initial conditions f(0) = 0 and f(1) = 1. You don't set those initial conditions. list is never initialized, so list[0] and list[1] will contain whatever garbage was in that hunk of memory.

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

Now it works.

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

Upvotes: 2

fastforward
fastforward

Reputation: 63

You need to allocate memory on demand for each iteration. In your code, n is uninitalized which leads to unpredectiable behavior. Also you need to initialize list[0] and list[1] since this is the 'base' case.

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

Upvotes: 0

You don't have return in main function.

n must be defined previous. Otherwise it took random value from memory. So, your list array is created with unknown value.

int list[n];

Also, this will never happends, becous n is declared, but not defined.

i < n;

Is this what you need?

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

Upvotes: 0

Lakshman Miani
Lakshman Miani

Reputation: 344

Here is code snippet,

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

   }

Upvotes: 0

Related Questions