大整数阶乘
问题描述
输入正整数n,计算出n!的准确值。这里要求(0<n<10的5次方)
问题分析
与通常的阶乘计算方法不一样的是这里的n比较大,使得计算出来的数超过了C语言的整数范围,因此,会使得整数溢出,从而得到错误的结果。对于大整数的阶乘,如何来解决呢?
我们考虑一下,既然这个数太大,一个变量是存储不下了,是否可以用多个变量来存储,分别存储这个数中的一个数,也就是说用数组来存储这个数。假设数组名为a,那么a[0]就是存储的这个数的个位数,a[1]就是存储的这个数的十位数,以前类推。
这样考虑完了后,问题来了,求阶乘需要进行数据的乘法运算,如何使这个数组表示的数与一个数相乘呢?举个例子如果 a[1]=2, a[0]=4, 这个数组就表示了一个为24的整数。如果让这个数组乘以5,如何来操作?
先让a[0]*5 得到 20 这是一个两位数,个位数是0,十位数是2,把个位数0放到 a[0]里面,十位数的2应该进位。接下来是求a[1]*5 得10,加上进位来的2,是12,那么,应该把12后面的2放到a[1],然后1进位。也就是说应该放到a[2]里面。以此类推。
参考程序
#include <stdio.h> int main(void) { int a[10000],i,j,l=0,s,n; scanf("%d",&n); a[0]=1; for(i=1;i<=n;i ) { s=0; for(j=0;j<=l;j ) { s=s a[j]*i;// 相乘并且加进位s a[j]=s;//数的最后一位给a[j] s=s/10;//这里的s是两位数中的第1位 } while(s)//说明超过了刚才数的位数,如本来a[1]a[0]是24 乘以5后,变成了120,比原来的24多1 { l ; //位,所以增加数组的位数 a[l]=s;//把个位数给a[l] s=s/10;// 分解s } } for(i=l;i>=0;i--) { printf("%d",a[i]); } return 0; }