#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;
}
高精度阶乘C语言实现
于 2022-03-05 14:02:18 首次发布