Factorial of each element in Fibonacci series
Last Updated :
18 Jan, 2022
Given the upper limit, print factorials of all Fibonacci Numbers smaller than the limit.
Examples :
Input : limit = 20
Output : 1 1 1 2 6 120 40320 6227020800
Explanation :
Fibonacci series in this range is 0, 1, 1, 2,
3, 5, 8, 13. Factorials of these numbers are
output.
Input : 50
Output : 1 1 1 2 6 120 40320 6227020800
51090942171709440000
295232799039604140847618609643520000000
We know simple factorial computations cause overflow very soon. Therefore, we use factorials of large numbers.
One simple solution is to generate all Fibonacci numbers one by one and compute factorial of every generated number using method discussed in factorials of large numbers
An efficient solution is based on the fact that Fibonacci numbers are increasing in order. So we use the previously generated factorial to compute next factorial.
C++
#include <iostream>
using namespace std;
#define MAX 500
void factorial( int prevFact[], int &size,
int prev, int n);
void printfibFactorials( int limit)
{
if (limit < 1)
return ;
int a = 1, b = 1, c = 2;
cout << a << " " << b << " " ;
int prevFact[MAX];
prevFact[0] = 1;
int size = 1;
while (c < limit)
{
factorial(prevFact, size, b, c);
a = b;
b = c;
c = a + b;
}
}
int multiply( int x, int prevFact[], int size)
{
int carry = 0;
for ( int i = 0; i < size; i++) {
int prod = prevFact[i] * x + carry;
prevFact[i] = prod % 10;
carry = prod / 10;
}
while (carry) {
prevFact[size] = carry % 10;
carry = carry / 10;
size++;
}
return size;
}
void factorial( int prevFact[], int &size,
int prev, int n)
{
for ( int x = prev+1; x <= n; x++)
size = multiply(x, prevFact, size);
for ( int i = size - 1; i >= 0; i--)
cout << prevFact[i];
cout << " " ;
}
int main()
{
int limit = 20;
printfibFactorials(limit);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int MAX = 500 ;
static int size = 1 ;
static void factorial( int []prevFact,
int prev, int n)
{
for ( int x = prev + 1 ;
x <= n; x++)
size = multiply(x, prevFact, size);
for ( int i = size - 1 ;
i >= 0 ; i--)
System.out.print(prevFact[i]);
System.out.print( " " );
}
static void printfibFactorials( int limit)
{
if (limit < 1 )
return ;
int a = 1 , b = 1 , c = 2 ;
System.out.print(a + " " +
b + " " );
int []prevFact = new int [MAX];
prevFact[ 0 ] = 1 ;
while (c < limit)
{
factorial(prevFact, b, c);
a = b;
b = c;
c = a + b;
}
}
static int multiply( int x,
int []prevFact,
int size)
{
int carry = 0 ;
for ( int i = 0 ; i < size; i++)
{
int prod = prevFact[i] *
x + carry;
prevFact[i] = prod % 10 ;
carry = prod / 10 ;
}
while (carry != 0 )
{
prevFact[size] = carry % 10 ;
carry = carry / 10 ;
size++;
}
return size;
}
public static void main(String args[])
{
int limit = 20 ;
printfibFactorials(limit);
}
}
|
Python3
MAX = 500
size = 1
def factorial(prevFact, prev,n) :
global size
for x in range ((prev + 1 ), n + 1 ) :
size = multiply(x, prevFact, size)
for i in range ((size - 1 ), - 1 , - 1 ) :
print (prevFact[i], end = "")
print (end = " " )
def printfibFactorials(limit) :
if (limit < 1 ) :
return
a = 1
b = 1
c = 2
print (a,b , end = " " )
prevFact = [ 0 ] * MAX
prevFact[ 0 ] = 1
while (c < limit) :
factorial(prevFact, b, c)
a = b
b = c
c = a + b
def multiply(x,prevFact,size) :
carry = 0
for i in range ( 0 , size) :
prod = prevFact[i] * x + carry
prevFact[i] = prod % 10
carry = prod / / 10
while (carry ! = 0 ) :
prevFact[size] = carry % 10
carry = carry / / 10
size = size + 1
return size
limit = 20
printfibFactorials(limit)
|
C#
using System;
class GFG
{
static int MAX = 500;
static void factorial( int []prevFact,
ref int size,
int prev, int n)
{
for ( int x = prev + 1; x <= n; x++)
size = multiply(x, prevFact, size);
for ( int i = size - 1; i >= 0; i--)
Console.Write(prevFact[i]);
Console.Write( " " );
}
static void printfibFactorials( int limit)
{
if (limit < 1)
return ;
int a = 1, b = 1, c = 2;
Console.Write(a + " " + b + " " );
int []prevFact = new int [MAX];
prevFact[0] = 1;
int size = 1;
while (c < limit)
{
factorial(prevFact, ref size, b, c);
a = b;
b = c;
c = a + b;
}
}
static int multiply( int x,
int []prevFact, int size)
{
int carry = 0;
for ( int i = 0; i < size; i++)
{
int prod = prevFact[i] *
x + carry;
prevFact[i] = prod % 10;
carry = prod / 10;
}
while (carry != 0)
{
prevFact[size] = carry % 10;
carry = carry / 10;
size++;
}
return size;
}
static void Main()
{
int limit = 20;
printfibFactorials(limit);
}
}
|
PHP
<?php
$MAX = 500;
$size = 1;
$prevFact = $prevFact =
array_fill (0, $MAX , 0);
function factorial( $prev , $n )
{
global $size , $prevFact ;
for ( $x = $prev + 1;
$x <= $n ; $x ++)
$size = multiply( $x , $size );
for ( $i = $size - 1;
$i >= 0; $i --)
echo $prevFact [ $i ];
echo " " ;
}
function printfibFactorials( $limit )
{
global $MAX , $prevFact ;
if ( $limit < 1)
return ;
$a = 1;
$b = 1;
$c = 2;
echo $a . " " . $b . " " ;
$prevFact [0] = 1;
while ( $c < $limit )
{
factorial( $b , $c );
$a = $b ;
$b = $c ;
$c = $a + $b ;
}
}
function multiply( $x , $size )
{
global $prevFact ;
$carry = 0;
for ( $i = 0;
$i < $size ; $i ++)
{
$prod = $prevFact [ $i ] *
$x + $carry ;
$prevFact [ $i ] = $prod % 10;
$carry = (int)( $prod / 10);
}
while ( $carry != 0)
{
$prevFact [ $size ] = $carry % 10;
$carry = (int)( $carry / 10);
$size ++;
}
return $size ;
}
$limit = 20;
printfibFactorials( $limit );
?>
|
Javascript
<script>
var MAX = 500;
var size = 1;
function factorial(prevFact , prev , n) {
for (x = prev + 1; x <= n; x++)
size = multiply(x, prevFact, size);
for (i = size - 1; i >= 0; i--)
document.write(prevFact[i]);
document.write( " " );
}
function printfibFactorials(limit) {
if (limit < 1)
return ;
var a = 1, b = 1, c = 2;
document.write(a + " " + b + " " );
var prevFact = Array(MAX).fill(0);
prevFact[0] = 1;
while (c < limit) {
factorial(prevFact, b, c);
a = b;
b = c;
c = a + b;
}
}
function multiply(x, prevFact , size) {
var carry = 0;
for (i = 0; i < size; i++) {
var prod = prevFact[i] * x + carry;
prevFact[i] = prod % 10;
carry = parseInt(prod / 10);
}
while (carry != 0) {
prevFact[size] = carry % 10;
carry = parseInt(carry / 10);
size++;
}
return size;
}
var limit = 20;
printfibFactorials(limit);
</script>
|
Output :
1 1 2 6 120 40320 6227020800
Share your thoughts in the comments
Please Login to comment...