本程序主要计算超大数的阶乘运算
#include<stdio.h>
#define maxsize 10000 //定义数组大小
int main()
{
int fun(int *a,int n,int i);
int a[maxsize]={0}; //j将数组赋值为0;
int n,i,j;
scanf("%d",&n);
if(n==0)
printf("1\n");
else
{
i=maxsize-1; //i取数组的最后一个单元
a[i]=1; //并将最后一个单元赋值为1;
while(n!=1)
{
i=fun(a,n,i); //将返回的值给i; 这时的i指向第一个数组元素不为0的数
n--;
}
j=i; //j从i开始,i记录的是第一个不为0的数的位置
for(;j<maxsize;j++)
{
if(a[j]==0)
printf("0000"); //因为四个连续的0在一个数组元素中只会存一个0,所以要特别输出四个0
else if(a[j]<10&&j!=i) //因为每个数组元素都是存一个四位,所以输出时也要是一个四位
printf("000%d",a[j]); //但是第一个数组元素可能不是一个四位数
else if(a[j]<100&&j!=i)
printf("00%d",a[j]);
else if(a[j]<1000&&j!=i)
printf("0%d",a[j]);
else
printf("%d",a[j]);
}
printf("\n");
}
return 0;
}
int fun(int *a,int n,int i)
{
int j,k,m,p,up;
for(p=maxsize-1;p>=i;p--) //p从最后开始一次往前乘以n;
a[p]=a[p]*n;
for(j=maxsize-1;j>=0;j--) //j从最后开始对每一个元素进行处理,直到数组的第一个数
{
k=j; //k记录j走到的位置
m=a[j]; //并用m取这个位置的数值
if(m!=0) //如果m等于0,说明这个位置不用进行往前进位
{
up=j; //up保留j位置每次不为0的位置,最后up保留的就是从前往后第一个不为0的数的位置,
while(m>=10000) //如果不等于0,判断是否大于五位数,
{
a[k]=m%10000; //如果大于五位数。则取后四位数保留下来
m=m/10000; //m的值去掉后四位
a[k-1]=a[k-1]+m; //并把剩的数往前进位,即将剩余的数往前加
k--; //k的位置往前移
m=a[k]; //并把该位置的数给m,接着判断是否大于五位数
}
}
}
return up; //把up的位置返回给i;这时up指向第一个不为0的位置
}