主要思想:
由于大数阶乘结果通常非常大,用long long保存都不一定够,因此,大数阶乘不能直接去相乘。可以采用数组存储进位的方法来存储。
例如,定义一个数组a[3],a[2] = 3,a[1] = 2,a[0] = 5,则表示这个数为325.当然,以上是采用10进制进行进位的。
如果进位设置为1000,那么如果a[2] = 223,a[1] = 100,a[0] = 4,表示223,100,4这样一个数。
在程序中,采用%来计算当前位的值,用/来计算进位值。
代码:
#include <stdio.h>
#define N 10
void main()
{
int a[3000]={1};
int n;
printf(" please input n (1~1000):");
do
{
scanf("%d",&n);
}
while (n>1000||n<0);
int wei=0;
int i;
for (i=2;i<=n;i++)
{
int jinwei=0;
int j;
for ( j=0;j<=wei;j++)
{
int w=a[j]*i+jinwei;
a[j]=w%N;
jinwei=w/N;
}
while(jinwei)
{
wei++;
a[wei]=jinwei%N;
jinwei/=N;
}
}
int sum=0;
int k;
for ( k=wei;k>=0;k--)
{
printf("%d",a[k]);
if(a[k]==0)sum=sum+1;
}
int m , count = 0;
for( m = 0;m<wei;m++)
{
if(a[m] == 0)
{
count ++;
}
else break;
}
printf("\n");
printf("%d%s%d\n",n,"!中共位数为:",wei);
printf("%d%s%d\n",n,"!中共有0的个数为:",sum);
printf("%d%s%d\n",n,"!尾部中共有0的个数为:",count);
}