大数阶乘——详解讲解

题目详情: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;

}
 
 
 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值