I was trying to make a program that prompts a user for a int value which uses is as the nth of the Fibonacci sequence.
This has goes all well for me until if you input 48. The Fibonacci output shows the last term a negative number, am I doing something wrong?
Open to criticism, I accept some pointers to study on more.
int i,Nth,Num1=0,Num2=1,Num3;
Num3=Num1+Num2;
printf("Enter Fibonacci Sequence terms limit: ");
scanf("%d",&Nth);
printf("Fibonacci Sequence: %d, %d",Num1,Num2);
for(i=3;i<=Nth;++i){
printf(", %d",Num3);
Num1=Num2;
Num2=Num3;
Num3=Num1+Num2;
};
This is the output when entering 48:
Fibonacci Sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811,
514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817,
39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170,
1836311903, -1323752223
The Fibonacci output shows the last term a negative number, am I doing something wrong?
Yes, you are. You have a signed integer overflow in your code. This is undefined behaviour, which means that anything can happen (including a "seemingly" working code).
this goes all well for me until if you input 48.
You can check the maximum value of an integer on your platform using INT_MAX
:
#include <stdio.h>
#include <limits.h> // You have to include this header
int main(void)
{
printf("INT_MAX = %d\n", INT_MAX);
}
Output:
INT_MAX = 2147483647
Which is smaller than fib(47) = 2971215073
.
One solution is to use long
instead of int
. This will solve your problem, unless you want very huge numbers. In this case, you would want to use a dedicated library.