50,但输出与答案一样
查看原帖
50,但输出与答案一样
1159387
jung_le楼主2024/3/26 15:33
#include<bits/stdc++.h>
using namespace std;
struct bignum{ 
	char s[20000]; 
	int num[20000]; 
	int len,flag; 
	bignum(){ 
		memset(num,0,sizeof(num)); 
		len=1; 
		flag=0; 
	}
	bignum(int x){
		for(len=1;x;len++){
			num[len]=x%10;
			x/=10;
		}
		len--;
	}
	int &operator[](int i){
		return num[i];
	}
	friend bool operator <(bignum a,bignum b){
		if(a.len != b.len){
			return a.len<b.len;
		}
		for(int i=a.len;i>=1;i--){
			if(a[i]<b[i])return true;
			if(a[i]>b[i])return false;
		}
		return false;
	}
	void input(){
		scanf("%s",s+1);
		len = strlen(s+1);
		for(int i=1;i<=len;i++)
			num[i] = s[len-i+1]-'0';
	}
	void print(){
		if(flag)cout<<'-';
		for(int i=len;i>=1;i--)cout<<num[i];
	}
};
bignum operator+(bignum a,bignum b){
	bignum ans;
	ans.len = max(a.len,b.len);
	for(int i=1;i<=ans.len;i++){
		ans[i] += a[i]+b[i];
		if(ans[i] >= 10){
			ans[i+1]++;
			ans[i]-=10;
		}
	}
	if(ans[ans.len + 1]){
		ans.len++;
	}
	return ans;
}
bignum operator-(bignum a,bignum b){
	bignum ans;
	if(a<b){
		ans.flag=1;
		swap(a,b);
	}
	ans.len = a.len;
	for(int i=1;i<=ans.len;i++){
		ans[i] += a[i]-b[i];
		if(ans[i] < 0){
			ans[i+1]--;
			ans[i]+=10;
		}
	}
	while(ans.len > 1 && ans[ans.len +1]==0)ans.len--;
	return ans;
}
bignum operator*(bignum a,bignum b){
	bignum ans;
	ans.len = a.len+b.len;
	for(int i=1;i<=a.len;i++){
		for(int j=1;j<=b.len;j++)
			ans[i+j-1] += a[i]*b[j];
	}
	for(int i=1;i<=ans.len;i++){
		if(ans[i]>=10){
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
		}
	}
	while(ans.len > 1 && ans[ans.len]==0)ans.len--;
	return ans;
}
bignum j(bignum a){
	bignum ans=1;
	for(bignum i=1;i<a+1;i=i+1){
		ans = ans*i;
	}
	return ans;
}
int main(){
	bignum a,ans;
	a.input();
	for(bignum i=1;i<a+1;i=i+1){
		ans = ans+j(i);
	}
	ans.print();
	cout<<endl;
	return 0;
}

输入:22

2024/3/26 15:33
加载中...