用了高精,50分求助
查看原帖
用了高精,50分求助
682483
OrangeRED楼主2024/7/24 18:25
#include<bits/stdc++.h>
using namespace std;

int a[2000],b[2000],c[4000];

string time(string x,string y){//高精乘 
	int lenx = x.size(),leny = y.size();
	for(int i=0;i<lenx;i++) a[i+1] = x[lenx-i-1] - '0';//字符to数字 
	for(int i=0;i<leny;i++) b[i+1] = y[leny-i-1] - '0';//并且倒序 
	for(int i=1;i<=lenx;i++){//开始运算 
		for(int j=1;j<=leny;j++){
			c[i+j-1] += a[i]*b[j];
			c[i+j] += c[i+j-1]/10;
			c[i+j-1] %= 10;
		}
	}
	int maxl = lenx+leny;
	while(!c[maxl] && maxl!=1) maxl--;//去除前导0 
	string sss="";
	for(int i=maxl;i>=1;i--) sss+=char(c[i]+'0');//逐位拼接 
	return sss;
}

string sum(string m,string n){//高精加(结构基本同上) 
	int lenm = m.size(),lenn = n.size();
	for(int i=0;i<lenm;i++) a[i+1] = m[lenm-i-1] - '0';
	for(int i=0;i<lenn;i++) b[i+1] = n[lenn-i-1] - '0';
	int maxl = max(lenm,lenn);
	for(int i=1;i<=maxl;i++){
		c[i] += a[i]+b[i];
		c[i+1] += c[i]/10;
		c[i] %= 10;
	}
	if(c[maxl+1]) maxl++;
	while(!c[maxl] && maxl!=1) maxl--;
	string sss="";
	for(int i=maxl;i>=1;i--) sss+=char(c[i]+'0');
	return sss;
}

int main(){
	int n;cin>>n;
	string s;
	string ans = "1",suma = "0";//初始化 
	for(int i=1;i<=n;i++){//阶乘 
		s = char(i+'0');
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		ans = time(ans,s);//阶乘累加
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		suma = sum(suma,ans);//加入答案
	}
	cout<<suma;
	return 0;
}
2024/7/24 18:25
加载中...