计算N的阶乘(大数)

计算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]);
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值