大数阶乘

昨天有事没更新博客,今天补上,最近忙于面试没时间去poj上A题只能写写一些基础的算法。大数阶乘很简单,但是如果你刚开始学编程的话,估计有点难度,因为毕竟不能按正常思路去做。

思路:正如题目所言是求大数阶乘所以如果按普通的想法必定会出现内存溢出,应为即使是64位的longlong型也不够,因为1000!的阶乘有3000多位。这时就要用到分治的思想了,既然不能用一个数来表示为什么不用一个数组或者是一个有序的集合来存储,每一个元素存储一定位数的数字。

代码如下:

#include<iostream>
using namespace std;
int main()
{
void factorial(int n) ;
int n;
cin>>n;
factorial(n);
return 0;
}
void factorial(int n) 
{	  //这里定义了一个长度为10000的数组,所以总共可以存储40000位的数组,如果想存储更大的数可以用list集合
      long a[10000];
      int i,j,c,m=0; 
      a[0]=1; 
      for(i=1;i<=n;i++) 
      { 
           c=0; 
           for(j=0;j<=m;j++) 
           { 
                 a[j]=a[j]*i+c; 
                 c=a[j]/10000;        //每一个数组中的元素存储一个一个不超过10000的int型数,可以用long型
                 a[j]=a[j]%10000; 
           } 
           if(c>0)					  //进位
           { 
                 m++; 
                 a[m]=c; 
           } 
      }
      cout<<a[m];
      for(i=m-1;i>=0;i--) 
         cout<<a[i]; 
	     cout<<endl;
}


你可能感兴趣的:(大数)