大数阶乘
??? 问题描述:编写程序,对给定的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.
程序实现:
- ?
- ?
- ?*作者Blog:http://blog.csdn.net/u012027907?
- ?*/??
- #include?<stdio.h>??
- #include?<malloc.h>??
- #define?MAXN?1000??
- ??
- //已知a中的(k-1)!,求k!??
- void?PreNext(int?a[],int?k)???
- {??
- ????int?*b,m?=?a[0],i,j,r,carry;??
- ????b?=?(int*)malloc(sizeof(int)*(m+1));??
- ????for(i?=?1;?i?<=?m;?i++)????
- ????????b[i]?=?a[i];??
- for(j?=?1;?j?<?k;?j++)?????
- ????{??
- ????????for(carry=0,i?=?1;i?<=?m;i++)??
- ????????{??
- ????????????r?=?(i?<=?a[0]?a[i]+b[i]:a[i])+carry;???
- ????????????a[i]?=?r?%?10;???
- ????????????carry?=?r?/?10;???
- ????????}??
- if(carry)????
- ????????????a[++m]?=?carry;??
- ????}??
- ????free(b);??
- ????a[0]?=?m;??
- }??
- void?Print(int?*a,87); background-color:inherit; font-weight:bold">int?k)??
- int?i;??
- ????int?m?=?0;??
- for(i?=?a[0];?i?>0;?i--){??
- ????????printf("%d",a[i]);??
- ????????m++;??
- ????????if(m?%?5?==?0)???????????????
- ????????????printf("?");????
- if(40?==?m)??????????????????
- ????????{????
- ????????????printf("n");????
- ????????????m?=?0;????????????
- ????printf("n");??
- }??
- void?main()??
- {??
- int?a[MAXN],n,k;??
- ????n?=?1;??
- ????printf("本程序计算任意位数的阶乘!n");??
- ??????
- ????while(n){??
- ????????printf("请输入一个数:");??
- ????????scanf("%d",&n);??
- ????????a[0]?=?a[1]?=?1;??
- for(k?=?2;?k?<=?n;?k++)??
- ????????{??
- ????????????PreNext(a,k);?????????
- ????????????if(k?==?n)??
- ????????????????Print(a,k);??
- ????????}??
- ????}??
- }??
运行截图:

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