计算n的阶乘,结果为大数。
大数的话,普通类型肯定存不下,所以一定要用其他方式来存储。
废话不多说,直接上代码。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define DIGIT 5 //DIGIT为数组每单元存放数的位数
#define MAX (int)pow(10,DIGIT) //10000
#define PI 3.1415926
void printFactorial(long *a,int n);
void printFactorial2(int *a,int n);
int main() {
int n=5;
//计算n的阶乘有多少位,赋值合适的数组大小
double t = (n*log(n) - n + 0.5*log(2*n*PI))/log(10);
int x=(int)t+1;
long *a=(long *)malloc(x*sizeof(long));
long *p=a; //对开辟的空间进行初始化
for(p=a;x--;p++){
*p=0;
}
*a=1;
printFactorial(a,n);
return 0;
}
//用数组求n的阶乘
void printFactorial(long *a,int n)
{
if(n<0){
printf("-1");
return;
}
if(n==0 || n==1){
printf("1");
return;
}
long i,carry,len=1;
do{
for(carry=0,i=0;i<len;i++)
{ //从第1位第n个数开始乘
a[i]=a[i]*n+carry;
carry=a[i]/MAX;
a[i]%=MAX;
//如果是最高位进位的话,结果长度加1、继续循环一次
!(i==len-1 && carry>0) ? : len++;
}
}while(--n);
printf("%ld",a[len-1]);
for(i=len-2;i>=0;i--)//每数组单元输出DIGIT位数字
printf("%0*ld",DIGIT,a[i]);
}
void printFactorial2(int a[],int n)//简单版本
{
int i,j=0;
int jinwei;
int len=1;
while(j++!=n)
{
jinwei=0;
for(i=0;i<len;i++)
{
a[i]=a[i]*j+jinwei;
jinwei=a[i]/10000;
a[i]=a[i]%10000;
if(i==len-1 && jinwei>0)
len++;
}
}
printf("%d",a[len-1]);
for(i=len-2;i>=0;i--)
printf("%04d",a[i]);
}