COJ 1019 高精度阶乘 S=1!+2!+3!+…+n!(n≤50)可以看作是 1067的深化,但是我不明白为什么我要用long long 来定义数组,好像有点浪费

COJ 1019 高精度阶乘 S=1!+2!+3!+…+n!(n≤50)可以看作是 1067的深化,但是我不明白为什么我要用long long 来定义数组,好像有点浪费
因为要反复求解某数的阶乘,所以求解之前要记得使用memset将数组清零
#include  < cstdlib >
#include 
< iostream >

using   namespace  std;

int  main()
{
    
long   long  a[ 30000 ],b[ 30000 ];
    
void  jiecheng( int  n,  long   long   * a);
    
int  n,i,j,carry; 
    cin
>> n;
    memset(a,
0 , sizeof (a));
    jiecheng(n,a);
    
for (i = n - 1 ;i > 0 ;i -- )
    {
        carry
= 0 ;memset(b, 0 , sizeof (b));
        jiecheng(i,b);
        
for (j = 1 ;j <= a[ 0 ];j ++ )
        {
            a[j]
+= b[j] + carry;
            carry 
= a[j] / 10 ;
            a[j]
= a[j] % 10 ;
        }
        
while (carry)
        {
            a[
0 ] ++ ;
            a[j]
= carry % 10 ;
            carry
/= 10 ;
            j
++ ;
        }
    }
    
for (i = a[ 0 ];i > 0 ;i -- )
        cout
<< a[i];
    cout
<< endl; 
    
    system(
" PAUSE " );
    
return   0 ;
}

void  jiecheng( int  n,  long   long   * a)
{
    
long   long  carry,i;
    
int  j;    
   
    
for (i = 1 ;i <= n;i ++ )
    {
        carry
= 0 ;
        
if (i == 1 )
        {    
            a[
0 ] = 1 ;a[ 1 ] = 1 ;
        }
        
else
        {
           
for (j = 1 ;j <= a[ 0 ];j ++
           {
                a[j]
= i * a[j] + carry;
                carry 
=  a[j] / 10 ;
                a[j]
= a[j] % 10 ;                
           }
           
while (carry)
            {
                a[
0 ] ++ ;
                a[j]
= carry % 10 ;
                carry
/= 10 ;
                j
++ ;
            }
        }
    }
    
/* for(i=a[0];i>0;i--)
        cout<<a[i];
    cout<<endl;
*/
}

你可能感兴趣的:(COJ 1019 高精度阶乘 S=1!+2!+3!+…+n!(n≤50)可以看作是 1067的深化,但是我不明白为什么我要用long long 来定义数组,好像有点浪费)