您的位置:首页 > 其它

计算N的阶乘(大数)

2014-04-15 17:15 274 查看
计算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]);
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: