去我的blog
偶贴一个
#define MAX 3000//根据n的大小来define当n为1000时大概要定义3000
#include<stdio.h>
int main()
{
int i = 1, j, n, tag = 0, a[MAX] = { 0 };
a[0] = 1;
scanf("%d", &n);
while(i <= n) {
for(j = 0; j < MAX; j++)
a[j] *= i;
for(j = 0; j < MAX; j++)
if(a[j] >= 10) {
a[j + 1] += a[j] / 10;//当然我们知道a[MAX]不会大于10,否则我们会增大数组下标
a[j] = a[j] % 10;//乘法算式
}
i++;
}//数组的每一个记录一位数字
for(j = MAX - 1; j >= 0; j--) {
if(a[j] != 0)
tag = 1;
if(a[j] != 0 || tag)
printf("%d", a[j]);
}//输出
printf("\n");
return 0;
}
//计算万以内(含10000)阶乘
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
short mul(short a[],short d,short x)
{ long i,y=0;
for(i=0;i<d;i++)
{ y+=a[i]*(long)x;//x:乘数
a[i]=(short)(y%10000);
y/=10000;
}
a[d]=(short)y;
return d+!!y;//返回(万进制下的)位数
}
void main()
{
long s;
short *a,i,j,n,ws=1;
printf("N=");scanf("%d",&n);
#define Pi 3.14159265358979323846L
s=(long)((log(2*Pi*n)/2+n*(log(n)-1))/log(10)+1);
a=(short*)malloc((s/4+2)*sizeof(short));*a=1;
for(i=2;i<=n;i++)
ws=mul(a,ws,i);
printf("%d!=%d",n,a[ws-1]);
for(j=ws-2;j>=0;j--)
printf("%04d",a[j]);
printf("\n");
free(a);
}