社区讨论

100分求调,为什么有前导0,悬关

P1009[NOIP 1998 普及组] 阶乘之和参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mia0jw5o
此快照首次捕获于
2025/11/22 16:14
3 个月前
此快照最后确认于
2025/11/22 17:03
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n;
string t="1",ans="0";
string add(string x,string y){
	int a1[2001],a2[2001],a3[2001]={0};
	int n1=x.size(),n2=y.size(),len=max(n1,n2);
	for(int i=0;i<n1;i++){
		a1[n1-i-1]=x[i]-'0';
	} 
	for(int i=0;i<n2;i++){
		a2[n2-i-1]=y[i]-'0';
	}
	for(int i=0;i<len;i++){
		a3[i]+=a1[i]+a2[i];
		if(a3[i]>=10){
			a3[i+1]+=a3[i]/10;
			a3[i]%=10;
		}
	}
	if(a3[len]==0)len--;
	string res="";
	for(int i=len;i>=0;i--){
		res+=a3[i]+'0';
	}
	return res;
}
string mul(string x,int y){
	int a1[20005],a2[200005]={0};
	int n1=x.size(),len=n1+20; 
	for(int i=0;i<n1;i++){
		a1[n1-i-1]=x[i]-'0';
	}
	for(int i=0;i<len;i++){
		a2[i]+=a1[i]*y;
		if(a2[i]>=10){
			a2[i+1]+=a2[i]/10;
			a2[i]%=10;
		}
	}
	while(a2[len]==0&&len>1)len--;
	string res="";
	for(int i=len;i>=0;i--){
		res+=a2[i]+'0';
	}
	return res;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		t=mul(t,i);
		ans=add(ans,t);
	}
	cout<<ans; 
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...