【学习笔记】大数阶乘

  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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值