求100的阶乘(ZZ)

这个问题其实并不难,主要是要采用合理的数据结构。

我用的是数组,int mul[1000],并将每个元素限定在 unit = 100 即 100 进制。

效率的确是有待改进,不过除非你要算宇宙的大小,否则耗时可以忽略不计。

关键是简短易懂,可移植。 

 

代码
#include  < stdio.h >  
 
#define  UNIT 1000 
#define  MUL 100000 
  
void  factorial( long   int  n); 
 
 
int  mul[MUL];  /*  每个元素规模为 UNIT,共 MUL 个,总共能储存 UNIT ^ MUL 规模数据  */   

 
int  main()
 {
     FILE 
* fp  =  fopen( " result.txt " " w " );
     
long   int  i, j;
     
     mul[
0 =   1 ;
     factorial(
10000 );
     
     
for (i = MUL - 1 ; mul[i]  ==   0   &&  i >= 0 ; i -- );
    
     fprintf(fp, 
" %d e %ld\n " , mul[i], i *   3 );
     
     
for ( ; i >= 0 ; i -- )
     {
         
if (mul[i]  ==   0
         {
             
for (j = UNIT; j / 10   >   0 ; j /= 10
                   fprintf(fp, 
" %d " 0 );
              
/* 这里注意0的打印问题,数组某一项中如果存放的是00,那就应该显示两个0.   */
         }
         
else  fprintf(fp,  " %d " , mul[i]);
     }
     getchar();
     fclose(fp);
     exit(
0 );
}
 
void  factorial( long   int  n)
 {
     
static   long   int  k;
     
long   int  i;
     
     
if (n  ==   1 return ;
     
else
     {
         
for (k = MUL - 1 ; mul[k]  ==   0   &&  k >= 0 ; k -- );
         
         
for (i = 0 ; i <= k; i ++ )
             mul[i] 
*=   n;
             
         
for (i = 0 ; i <= k; i ++ )
         {
             
if (mul[i]  >=  UNIT)
             {
                 mul[i
+ 1 +=  mul[i]  /  UNIT;
                 mul[i] 
%=  UNIT;
             }
         }
         factorial(n
- 1 );
     }
}

 

 

你可能感兴趣的:(阶乘)