Given a number ‘n’, how to check if n is a Fibonacci number. First few Fibonacci numbers are 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..
Examples :
Input : 8
Output : Yes
Input : 34
Output : Yes
Input : 41
Output : No
Approach 1:
A simple way is to generate Fibonacci numbers until the generated number is greater than or equal to ‘n’. Following is an interesting property about Fibonacci numbers that can also be used to check if a given number is Fibonacci or not.
A number is Fibonacci if and only if one or both of (5*n2 + 4) or (5*n2 – 4) is a perfect square (Source: Wiki). Following is a simple program based on this concept.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPerfectSquare( int x)
{
int s = sqrt (x);
return (s * s == x);
}
bool isFibonacci( int n)
{
return isPerfectSquare(5 * n * n + 4)
|| isPerfectSquare(5 * n * n - 4);
}
int main()
{
for ( int i = 1; i <= 10; i++)
isFibonacci(i)
? cout << i << " is a Fibonacci Number \n"
: cout << i << " is a not Fibonacci Number \n" ;
return 0;
}
|
C
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
bool isPerfectSquare( int x)
{
int s = sqrt (x);
return (s * s == x);
}
bool isFibonacci( int n)
{
return isPerfectSquare(5 * n * n + 4)
|| isPerfectSquare(5 * n * n - 4);
}
int main()
{
for ( int i = 1; i <= 10; i++) {
if (isFibonacci(i))
printf ( "%d is a Fibonacci Number \n" , i);
else
printf ( "%d is a not Fibonacci Number \n" , i);
}
return 0;
}
|
Java
class GFG
{
static boolean isPerfectSquare( int x)
{
int s = ( int ) Math.sqrt(x);
return (s*s == x);
}
static boolean isFibonacci( int n)
{
return isPerfectSquare( 5 *n*n + 4 ) ||
isPerfectSquare( 5 *n*n - 4 );
}
public static void main(String[] args)
{
for ( int i = 1 ; i <= 10 ; i++)
System.out.println(isFibonacci(i) ? i + " is a Fibonacci Number" :
i + " is a not Fibonacci Number" );
}
}
|
Python
import math
def isPerfectSquare(x):
s = int (math.sqrt(x))
return s * s = = x
def isFibonacci(n):
return isPerfectSquare( 5 * n * n + 4 ) or isPerfectSquare( 5 * n * n - 4 )
for i in range ( 1 , 11 ):
if (isFibonacci(i) = = True ):
print i, "is a Fibonacci Number"
else :
print i, "is a not Fibonacci Number "
|
C#
using System;
class GFG {
static bool isPerfectSquare( int x)
{
int s = ( int )Math.Sqrt(x);
return (s * s == x);
}
static bool isFibonacci( int n)
{
return isPerfectSquare(5 * n * n + 4) ||
isPerfectSquare(5 * n * n - 4);
}
public static void Main()
{
for ( int i = 1; i <= 10; i++)
Console.WriteLine(isFibonacci(i) ? i +
" is a Fibonacci Number" : i +
" is a not Fibonacci Number" );
}
}
|
Javascript
<script>
function isPerfectSquare( x)
{
let s = parseInt(Math.sqrt(x));
return (s * s == x);
}
function isFibonacci( n)
{
return isPerfectSquare(5 * n * n + 4) ||
isPerfectSquare(5 * n * n - 4);
}
for (let i = 1; i <= 10; i++)
isFibonacci(i)? document.write( i + " is a Fibonacci Number <br/>" ):
document.write(i + " is a not Fibonacci Number <br/>" ) ;
</script>
|
PHP
<?php
function isPerfectSquare( $x )
{
$s = (int)(sqrt( $x ));
return ( $s * $s == $x );
}
function isFibonacci( $n )
{
return isPerfectSquare(5 * $n * $n + 4) ||
isPerfectSquare(5 * $n * $n - 4);
}
for ( $i = 1; $i <= 10; $i ++)
if (isFibonacci( $i ))
echo "$i is a Fibonacci Number \n" ;
else
echo "$i is a not Fibonacci Number \n" ;
?>
|
Output
1 is a Fibonacci Number
2 is a Fibonacci Number
3 is a Fibonacci Number
4 is a not Fibonacci Number
5 is a Fibonacci Number
6 is a not Fibonacci Number
7 is a not Fibonacci Number
8 is a Fibonacci Number
9 is a not Fibonacci Number
10 is a not Fibonacci Number
Time Complexity: O(log N), where N is is the number that we square-root.
Auxiliary Space: O(1)
Approach 2:
In this approach, we first handle the special case where the input number is 0 (which is a Fibonacci number). Then, we use a while loop to generate Fibonacci numbers until we find a Fibonacci number greater than or equal to the input number. If the generated Fibonacci number is equal to the input number, we return true. Otherwise, we check if either (5 * n * n + 4) or (5 * n * n – 4) is a perfect square, as per the formula mentioned in the original code.
This approach may be more efficient than the original code in some cases, especially for larger input values, as it generates Fibonacci numbers on-the-fly and stops as soon as it finds a Fibonacci number greater than or equal to the input number.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPerfectSquare( int n) {
int root = sqrt (n);
return (root * root == n);
}
bool isFibonacci( int n) {
if (n == 0) {
return true ;
}
int a = 0, b = 1, c = 1;
while (c < n) {
a = b;
b = c;
c = a + b;
}
return (c == n || isPerfectSquare(5 * n * n + 4) || isPerfectSquare(5 * n * n - 4));
}
int main() {
for ( int i = 1; i <= 10; i++) {
if (isFibonacci(i)) {
cout << i << " is a Fibonacci number.\n" ;
} else {
cout << i << " is not a Fibonacci number.\n" ;
}
}
return 0;
}
|
Java
import java.util.*;
public class Main {
public static boolean isPerfectSquare( int n) {
int root = ( int ) Math.sqrt(n);
return (root * root == n);
}
public static boolean isFibonacci( int n) {
if (n == 0 ) {
return true ;
}
int a = 0 , b = 1 , c = 1 ;
while (c < n) {
a = b;
b = c;
c = a + b;
}
return (c == n || isPerfectSquare( 5 * n * n + 4 ) || isPerfectSquare( 5 * n * n - 4 ));
}
public static void main(String[] args) {
for ( int i = 1 ; i <= 10 ; i++) {
if (isFibonacci(i)) {
System.out.println(i + " is a Fibonacci number." );
} else {
System.out.println(i + " is not a Fibonacci number." );
}
}
}
}
|
Python3
import math
def is_perfect_square(n):
root = int (math.sqrt(n))
return (root * root = = n)
def is_fibonacci(n):
if n = = 0 :
return True
a, b, c = 0 , 1 , 1
while c < n:
a = b
b = c
c = a + b
return c = = n or is_perfect_square( 5 * n * n + 4 ) or is_perfect_square( 5 * n * n - 4 )
for i in range ( 1 , 11 ):
if is_fibonacci(i):
print (i, "is a Fibonacci number." )
else :
print (i, "is not a Fibonacci number." )
|
C#
using System;
public class Program {
static bool IsPerfectSquare( int n) {
int root = ( int )Math.Sqrt(n);
return (root * root == n);
}
static bool IsFibonacci( int n) {
if (n == 0) {
return true ;
}
int a = 0, b = 1, c = 1;
while (c < n) {
a = b;
b = c;
c = a + b;
}
return (c == n || IsPerfectSquare(5 * n * n + 4) || IsPerfectSquare(5 * n * n - 4));
}
public static void Main() {
for ( int i = 1; i <= 10; i++) {
if (IsFibonacci(i)) {
Console.WriteLine(i + " is a Fibonacci number." );
}
else {
Console.WriteLine(i + " is not a Fibonacci number." );
}
}
}
}
|
Javascript
function is_perfect_square(n) {
let root = Math.floor(Math.sqrt(n));
return (root * root === n);
}
function is_fibonacci(n) {
if (n === 0) {
return true ;
}
let a = 0, b = 1, c = 1;
while (c < n) {
[a, b] = [b, c];
c = a + b;
}
return c === n || is_perfect_square(5 * n * n + 4) || is_perfect_square(5 * n * n - 4);
}
for (let i = 1; i <= 10; i++) {
if (is_fibonacci(i)) {
console.log(i + " is a Fibonacci number." );
} else {
console.log(i + " is not a Fibonacci number." );
}
}
|
Output
1 is a Fibonacci number.
2 is a Fibonacci number.
3 is a Fibonacci number.
4 is not a Fibonacci number.
5 is a Fibonacci number.
6 is not a Fibonacci number.
7 is not a Fibonacci number.
8 is a Fibonacci number.
9 is not a Fibonacci number.
10 is not a Fibonacci number.
Time Complexity: O(log N), where N is is the number that we square-root.
Auxiliary Space: O(1)
Approach 3:
This is another approach to check if a given number is Fibonacci number or not.
Steps:
To check if a given number is Fibonacci number or not, we do the following steps:
- First check if the number is 0 or 1, then return true.
- Then till the number comes do while loop.
- In each iteration:
- First calculate Fibonacci of that iteration.
- Then check if it matches with given number or not.
- If matches, return true.
- If the value goes beyond, given number then return false.
- Otherwise continue.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
bool isFibonacci( int N)
{
if (N == 0 || N == 1)
return true ;
int a = 0, b = 1, c;
while ( true ) {
c = a + b;
a = b;
b = c;
if (c == N)
return true ;
else if (c >= N) {
return false ;
}
}
}
int main()
{
for ( int i = 1; i <= 10; i++) {
if (isFibonacci(i)) {
cout << i << " is a Fibonacci number.\n" ;
}
else {
cout << i << " is not a Fibonacci number.\n" ;
}
}
return 0;
}
|
Java
public class GFG {
static boolean isFibonacci( int N)
{
if (N == 0 || N == 1 )
return true ;
int a = 0 , b = 1 , c;
while ( true ) {
c = a + b;
a = b;
b = c;
if (c == N)
return true ;
else if (c >= N) {
return false ;
}
}
}
public static void main(String[] args)
{
for ( int i = 1 ; i <= 10 ; i++) {
if (isFibonacci(i)) {
System.out.println(
i + " is a Fibonacci number." );
}
else {
System.out.println(
i + " is not a Fibonacci number." );
}
}
}
}
|
Python3
def isFibonacci(N):
if N = = 0 or N = = 1 :
return True
a, b = 0 , 1
while True :
c = a + b
a = b
b = c
if c = = N:
return True
elif c > = N:
return False
if __name__ = = '__main__' :
for i in range ( 1 , 11 ):
if isFibonacci(i):
print (i, "is a Fibonacci number." )
else :
print (i, "is not a Fibonacci number." )
|
C#
using System;
public class GFG {
static bool IsFibonacci( int N)
{
if (N == 0 || N == 1)
return true ;
int a = 0, b = 1, c;
while ( true ) {
c = a + b;
a = b;
b = c;
if (c == N)
return true ;
else if (c >= N) {
return false ;
}
}
}
static void Main( string [] args)
{
for ( int i = 1; i <= 10; i++) {
if (IsFibonacci(i)) {
Console.WriteLine(
$ "{i} is a Fibonacci number." );
}
else {
Console.WriteLine(
$ "{i} is not a Fibonacci number." );
}
}
}
}
|
Output
1 is a Fibonacci number.
2 is a Fibonacci number.
3 is a Fibonacci number.
4 is not a Fibonacci number.
5 is a Fibonacci number.
6 is not a Fibonacci number.
7 is not a Fibonacci number.
8 is a Fibonacci number.
9 is not a Fibonacci number.
10 is not a Fibonacci number.
Time Complexity: O(N), for iteration.
Auxiliary Space: O(1)
This article is contributed by Abhay Rathi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.