题目详情:NYOJ-大数阶乘
阶乘相信大家都不陌生,简单一点的循环递归都可以解决。
在这里将要讲解的大数阶乘,即使用 long-int也是搞不定的,(最大的long-int=4294967295,而50!=30414093201713378043612608166064768844377641568960512000000000000(64位数字))。查阅了大量代码,有了以下理解。
1、首先要开一个超级大的数组存放算出来的结果,每个元素只存结果的一位数字;
2、结果储存时候也采用倒叙储存,即这很好理解,即 : 将 456 存储在数组里为:a[0]=6;a[1]=5;a[2]=4;
3、采用倒叙求阶乘(例如:10!=1 * 2 * 3 * ······ * 9 * 10);
4、将计算与存储分开;先将现有结果分别乘上n( n=n,n-1,n-2 ······ 2,1),每次计算过后进行一次结果梳理,实现每个数组元素存储结果的一位数的效果。
不太懂得可以参照以下代码,超级详细;
代码如下 :↓
#include <iostream>
#include <cstring>
#define N 100000
using namespace std;
int a[N];
int main( )
{
int j,w=0;
long f;
cin>>f;
memset( a,0,N*sizeof(long ));
a[0]=1;
for(int i=1;i<=f;i++)
{
for(j=0;j<=w;j++) //计算
{a[j]*=i;}
int h=0;
while(h<=w) //结果梳理
{
if((h==w)&&((a[w]/10)>0))
w++;
a[h+1]+=a[h]/10;
if(a[h]/10>0) a[h]%=10;
h++;
}
}
while(w>=0) // 倒叙输出
cout<<a[w--];
cout<<endl;
return 0;
}