【学习笔记】大数阶乘

  1. #define N 100    //计算N的阶乘,最多只能算到9999   
  2. long a[8916]={1,0}, n , i , carry ,len;  
  3. int main()   
  4. {  
  5.     n=N;  
  6.     long  tmp ;
  7.     for ( len=1;n>1; n--)  
  8.     {  
  9.         for (c=0,i=0; i < len ; i++ )  
  10.         {  
  11.             tmp = a[i] * n + carry;  
  12.             a[i] = tmp % 10000;    // 两个4位数相乘不会大于long型
  13.             carry = tmp / 10000;  
  14.         }  
  15.         a[i] = carry ;  
  16.         if ( carry >0 )   len++;  
  17.     }  
  18.     //输出
  19.     printf("%d",a[len-1]);  
  20.     for( len--;len>=0;len--)  
  21.         printf("%04d",a[len]);  
  22.     return 0;  
  23. }  


两数相乘:

  1. void mul(unsigned char a[],unsigned long k,int m,int n)  
  2. {  
  3.     int i;  
  4.     unsigned long p;  
  5.     unsigned long c=0;  
  6.       
  7.     for ( i=m+n-1; i>=n;i--)  
  8.     {  
  9.         p= a[i] * k +c;  
  10.         a[i]=(unsigned char)( p % 10);  
  11.         c= p / 10;  
  12.     }  
  13.       
  14.     while (c>0)  
  15.     {  
  16.         a[i]=(unsigned char)( c % 10);  
  17.         i--;  
  18.         c /=10;  
  19.     }  
  20. }  


 方法:把 乘数  乘以  被乘数  的一个数组元素,结果对 xx ( 10  1000 等) 取余 加上 进位数字 为当前位的结果,对 xx 取整为进位,乘数  和  下一个数组元素  相乘  加上  进位数字  得当前位的结果。


转自:http://blog.csdn.net/liangbch/article/details/3230428



你可能感兴趣的:(数据结构与算法,编程语言细节,学习笔记)