另一种求大数阶乘的算法

大数阶乘

    问题描述:编写程序,对给定的n(n <= 100),计算并输出k的阶乘k!的全部有效数字。

    注意:如果要求一个5的阶乘,用整型可以存储,求10的阶乘可以用长整型表示,但若要求100的阶乘,就无法用长整型表示,此时就必须考虑别的方法。

    要求的k!的值,必定已求得(k-1)!的值,依次地推,当 k = 2时,要求的1! = 1为已知。求得(k-1)!的值后,对(k-1)!连续累加k-1此后即可求得K!值。

    例如:5!= 120,计算6!,可对原来的120累加5次120后得到720.

   由于k!可能大大超出一般整数的位数,因此程序用一个一维数组存储长整型,存储长整数数组的每个元素只存储长整数的一位数字。如有m位长整数N用数组a[]存储,并用a[0]存储长整数N的位数m,即a[0] = m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素....

  例如:6! = 720,在数组中的存储形式为:

 a[0]       a[1]        a[2]     a[3]

  3         0           2        7

 a[0] = 3表示长整数是一个3位数,接着从低位到高位依次是0、2、7,表示成整数720.

程序实现:

[cpp]  view plain copy
  1. /* 
  2.  *程序功能:计算任意位数的阶乘 
  3.  *作者Blog:http://blog.csdn.net/u012027907 
  4.  */  
  5. #include <stdio.h>  
  6. #include <malloc.h>  
  7. #define MAXN 1000  
  8.   
  9. //已知a中的(k-1)!,求k!  
  10. void PreNext(int a[],int k)   
  11. {  
  12.     int *b,m = a[0],i,j,r,carry;  
  13.     b = (int*)malloc(sizeof(int)*(m+1));  
  14.     for(i = 1; i <= m; i++)    
  15.         b[i] = a[i];  
  16.     for(j = 1; j < k; j++)   //控制累加k-1次  
  17.     {  
  18.         for(carry=0,i = 1;i <= m;i++)  
  19.         {  
  20.             r = (i <= a[0]?a[i]+b[i]:a[i])+carry; //计算加的结果  
  21.             a[i] = r % 10; //计算本位结果  
  22.             carry = r / 10; //计算进位数字  
  23.         }  
  24.         if(carry)  //向最高为进位  
  25.             a[++m] = carry;  
  26.     }  
  27.     free(b);  
  28.     a[0] = m;  
  29. }  
  30. void Print(int *a,int k)  
  31. {  
  32.     int i;  
  33.     int m = 0;  
  34.     for(i = a[0]; i >0; i--){  
  35.         printf("%d",a[i]);  
  36.         m++;  
  37.         if(m % 5 == 0)             //每5个数字空一格     
  38.             printf(" ");    
  39.         if(40 == m)                //每行输出40个数字     
  40.         {    
  41.             printf("\n");    
  42.             m = 0;            
  43.         }  
  44.     }  
  45.     printf("\n");  
  46. }  
  47. void main()  
  48. {  
  49.     int a[MAXN],n,k;  
  50.     n = 1;  
  51.     printf("本程序计算任意位数的阶乘!\n");  
  52.       
  53.     while(n){  
  54.         printf("请输入一个数:");  
  55.         scanf("%d",&n);  
  56.         a[0] = a[1] = 1;  
  57.         for(k = 2; k <= n; k++)  
  58.         {  
  59.             PreNext(a,k);         
  60.             if(k == n)  
  61.                 Print(a,k);  
  62.         }  
  63.     }  
  64. }  

运行截图:

转载请标明出处:http://blog.csdn.net/u012027907

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值