高精度阶乘C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h> 
//高精度阶乘,计算n!

//时间复杂度为O(n^2*logn)
//空间复杂度为O(nlogn) 

//本地计算 100000!耗时106s

int main(void){
	int n,l=1,lm;	//l用于记录当前占用数组长度,lm用于保存所需数组长度 
	char *m; 		//数组声明为char以节省内存开销 
	scanf("%d",&n);
	if(n>0){	
		lm=(log(n)/log(10))*n+10; //该公式用于计算数组长度,由lg(n^n)+10的转换而来,降低了计算复杂度,+10防止溢出 
		m=(char*)malloc(sizeof(char)*lm);		//申请数组内存 
		m[0]=1;	//初始化基数,以小端模式存储 
		for(int s,i=1;i<=n;i++){		//i为当前乘数 
			s=0;	//s保存进位数,每到下一个乘数归零 
			for(int j=0;j<l;j++){	//从最低位循环到最高位,l将动态变化 
				int temp=s+m[j]*i;	//temp暂存当前位运算结果:==进位数+当前位*当前因子i 
				m[j]=temp%10;		//temp取余,更新当前位 
				s=temp/10;		//temp舍弃最后一位,参与下次运算 
			}
			while(s){		// 每一位都已参与运算,余下一个进位数待处理 
				m[l++]=s%10;	//取余更新当前位,l总是指向下一个位置 
				s/=10;		//舍弃最后一位,一直循环到s为0,这个过程中l也将持续增长更新 
			}
		}
		for(int i=l-1;i+1;i--){	 //从最高位开始打印结果 
			printf("%d",m[i]); 		
		}
	}
	else if(!n)printf("1");		//n==0时特判 
	else printf("negative number");			//n<0时报错 
	return 0;
}

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值