大数阶乘问题的c++实现

首先看一个简单的使用递归算法的n!程序:

#include<iostream>
using namespace std;
long fac(int);
int main(){
  int n;
  cout<<"请输入数字n,将输出n!:"<<endl;
  cin>>n;
  long y=fac(n);
  cout<<y<<endl;	
  return 0;
}

long fac(int n){
long f;
if(n<0){
	cout<<"errro,请输入正数!!"<<endl;
	return -1; 
}
else if(n==0)
    return 1;
else if(n==1) return 1;
	f=n*fac(n-1);
	return f;
}

显然,这个程序中的n是有上限的,当long占8字节的时候,f的取值范围是
-9223372036854775808~9223372036854775807;

所以诸如计算1000!的值是不可以用上述程序求解的。

当然,

由于位数的限制,没有任何编程语言,可以存储例如1000!这个乘法结果的量。解决的方法是采用数组来存储。

首先令数组的最后一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。

#include<iostream>
using namespace std;
int main()
{
int array_num[3000];			// 合适大小即可
int total,rem=0,count,ix;		//rem 用来保存余数    
for(ix=0;ix<3000;ix++)
	array_num[ix]=0;	
	
ix=2999;			
array_num[2999]=1;


for(count=2;count<=100;count++)
{
  while(ix>0)
   {
      total=array_num[ix]*count+rem;
      rem=0;
	if(total>9)
	 {
	  array_num[ix]=total%10;
	  rem=total/10;
	 }
	else
	 array_num[ix]=total;
      ix--;
   }
rem=0;
total=0;
ix=2999;
}


for(ix=0;ix<3000;ix++)            
{
	if(array_num[ix]!=0 | count==1)
	{
	  cout<<array_num[ix];
	  count=1;
	}
}
}

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/xujinsmile/article/details/7295547
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞