斐波那契数列中每个元素的阶乘

data structurec++server side programmingprogramming

在本文中,我们将讨论一个简单的程序,该程序计算斐波那契数列中小于给定数字的所有数字的阶乘。

问题陈述

我们得到一个数字,我们的任务是生成斐波那契数列中所有小于给定数字的数字的阶乘。

让我们首先借助示例了解问题陈述和代码解决方案的要求。

输入

nums = 13

输出

斐波那契数列最多 13 个是 0、1、1、 2、3、5、

因此,斐波那契数列中所有小于 13 的数字的阶乘为 1 1 2 6 120 40320

现在让我们讨论一下这个问题的解决方案。

这里,我们有两个主要问题 −

  • 要生成斐波那契数列,我们必须计算每个数字的阶乘。如果我们考虑逐个计算每个斐波那契数的阶乘,这将非常耗时。

  • 计算数字的阶乘,其结果非常大,无法存储为整数。

方法

谈到第一个主要问题的解决方案,我们可以通过存储最后一个使用的斐波那契数的阶乘来最大限度地减少每个斐波那契数的阶乘计算次数。众所周知,斐波那契数是按顺序递增的,我们可以轻松地存储前一个斐波那契数的阶乘,并使用存储的阶乘计算下一个斐波那契数的阶乘。

对于下一个主要问题,即计算数字的阶乘,这些数字的阶乘会导致溢出,因为它们相对较大并且无法存储为整数。为此,我们需要使用一个数组来存储阶乘的数字并进行相应的计算。

示例

给定问题陈述的解决方案代码。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

#define M 500
void func(int lastfact[], int &len, int previous , int n);
void printfibFactorials(int nums) {
   if (nums < 1)
   return;  
   int p = 1, q = 1, r = 2;
   cout <<  p << endl << q << endl;
   int lastfact[M];
   lastfact[0] = 1;    
   int len = 1;    
   while (r < nums) {
      func( lastfact, len, q , r );
      p = q ;
      q = r ;
      r = p + q ;
   }
}
int multiply(int n, int lastfact[], int len) {
   int c = 0;
   for (int iterator = 0; iterator < len; iterator++) {
      int prod = lastfact[iterator] * n + c;
      lastfact[iterator] = prod % 10;
      c = prod / 10;
   }  
   while (c){
      lastfact[len] = c % 10;
      c = c / 10;
      len++;
   }    
   return len;
}
void func(int lastfact[], int &len, int previous, int n) {
   for (int p = previous + 1; p <= n; p++)
   len = multiply( p , lastfact , len );        
   for (int iterator = len - 1; iterator >= 0; iterator--)
   cout << lastfact[iterator];
   cout << endl;
}
int main() {
   int nums = 13;
   cout<< " The factorial of numbers upto " << nums << " is ";
   printfibFactorials(nums);
   return 0;
}

输出

The factorial of numbers upto 13 is 
1
1
2
6
120
40320

结论

在本文中,我们以最佳的空间复杂度计算了斐波那契数列中所有小于给定数字的数字的阶乘。为了最大限度地减少占用的空间,我们保存了之前计算的阶乘以生成下一个斐波那契数的阶乘。此外,为了避免阶乘数字过大而导致溢出,我们使用数组将阶乘的不同数字保存在不同的位置。


相关文章