25分求救,6以上就不行了
查看原帖
25分求救,6以上就不行了
367851
penguin_cpp楼主2021/8/4 16:23
#include <iostream>
#include <cmath>
#define maxn 5010
using namespace std;

int len(int abc[maxn]) {	// 查看数组长度,从 1 开始 
	int i=1;
	for(i; abc[i+1]; i++);
	return i;
}

void re0(int (&abc)[maxn]) {	// 清零数组 
	for(int i=1; i<=maxn; i++)
		abc[i]=0;
	return;
}

void procheng(int (&a0)[maxn],int (&b0)[maxn],int (&c0)[maxn]) {	// 高精度乘法 
	re0(c0);
	for(int i=1; i<=len(a0); i++)
		for(int j=1; j<=len(b0); j++)
			c0[i+j-1]+=a0[i]*b0[j];
	for(int i=1; i<=max(1,len(a0)+len(b0)); i++) {
		c0[i+1]+=c0[i]/10;
		c0[i]%=10;
	}
	return;
}

void projia(int (&a0)[maxn],int (&b0)[maxn],int (&c0)[maxn]) {	// 高精度加法 
	re0(c0);
	for(int i=1; i<=max(len(a0),len(b0)); i++) {
		c0[i]+=a0[i]+b0[i];
		c0[i+1]=c0[i]/10;
		c0[i]%=10;
	}
	return;
}

void copy(int (&a0)[maxn],int (&b0)[maxn]) {	// 复制数组 
	for(int i=1; i<=len(a0); i++)
		b0[i]=a0[i];
	return;
}

int main() {
	int num[maxn]={0,1},evtime[maxn],tem[maxn],sum[maxn];
	re0(sum);
	int n;
	cin>>n;	// 阶乘数字
	for(int i=1; i<=n; i++) {
		evtime[1]=i%10;
		evtime[2]=i/10;
		procheng(num,evtime,tem);
		copy(tem,num);
		projia(num,sum,tem);
		copy(tem,sum);
	}
	for(int i=len(sum); i>=1; i--)
		cout<<sum[i];
	return 0;
}
	/*
	
	num 每次阶乘结果
	evtime 本次阶乘乘的数字
	tem 暂存器 
	sum 所有阶乘结果
	
	num*evtime>tem 
	tem>num
	num+sum>tem
	tem>sum
	
	*/

附阶乘正确结果:

1	1
2	3
3	9
4	33
5	153
6	873
7	5913
8	46233
9	409113
10	4037913
2021/8/4 16:23
加载中...