阶乘高精度实现(高精度*低精度)

经常会遇见阶乘的处理,而一旦阶乘过大,基本类型就吃不消了,这里介绍一种高精阶乘的实现,将每次阶乘的计算结果放入数组中储存,而每次结果由高精的数组元素乘与低精的整型元素得来

高精数组每一位 * 低精度普通类型 = 高精数组每一位

两个至关重要的变量:

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;
}
发布了160 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/105067585
今日推荐