经常会遇见阶乘的处理,而一旦阶乘过大,基本类型就吃不消了,这里介绍一种高精阶乘的实现,将每次阶乘的计算结果放入数组中储存,而每次结果由高精的数组元素乘与低精的整型元素得来
高精数组每一位 * 低精度普通类型 = 高精数组每一位
两个至关重要的变量:
int ws=1;//储存位数
int jw=0;//储存进位
代码核心:
for( i=2;i<=x;i++){//单精度普通类型
for( j=1;j<=ws;j++){//数组高精度每位数字
a[j]=a[j]*i+jw;//普通类型与高精度每一位相乘
jw=a[j]/10;//将多余的存入进位
a[j]=a[j]%10; //留下取余的结果
}
末尾处理:
while(jw){//当还剩进位的话需要处理完
a[j++]=jw%10;//将剩余的进位依次分解存入数组中
jw/=10;
}
全部代码:
#include<cstdio>
#include<cstring>
int a[100005];
int n;
void Factorial(int x){
int ws=1;//位数
int jw=0;//进位
int i,j;
memset(a,0,sizeof(0));//数组初始化
a[1]=1;//第一项必须为1
for( i=2;i<=x;i++){//单精度
for( j=1;j<=ws;j++){//数组高精度数字
a[j]=a[j]*i+jw;
jw=a[j]/10;
a[j]=a[j]%10;
}
while(jw){//当还剩进位的话需要处理完
a[j++]=jw%10;
jw/=10;
}
ws=j-1;
}
for(int i=ws;i>=1;i--){//反向输出是从大到小
printf("%d",a[i]);
}
}
int main(){
scanf("%d",&n);
Factorial(n);//计算n的阶乘
return 0;
}