xuyi20110411 @ 2024-10-04 19:47:50
#include<bits/stdc++.h>
using namespace std;
int n,k;
string s,k1;
string bg(string a,string b){
int a1[55]={0},b1[55]={0},ci,c[2010011]={0};
string d="";
for(int i=a.size()-1;i>=0;i--)a1[a.size()-i]=a[i]-'0';
for(int i=b.size()-1;i>=0;i--)b1[b.size()-i]=b[i]-'0';
for(int i=1;i<=a.size();i++){
ci=0;
for(int j=1;j<=b.size();j++){
c[i+j-1]=a1[i]*b1[j]+ci+c[i+j-1];
ci=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+b.size()]=ci;
}
int lenc=a.size()+b.size();
while(lenc>1&&c[lenc]==0)lenc--;
for(int i=lenc;i>=1;i--)d+=c[i]+'0';
return d;
}
string x(int a){
if(a==1)return "1";
else{
string d="",e="";
int m=a;
while(m){
d+=(char)((m%10)+'0');
m/=10;
}
for(int i=d.size()-1;i>=0;i--)e+=d[i];
return bg(e,x(a-1));
}
}
void m(string a){
int a1[55]={0},b1[55]={0},c1[2000111]={0};
int lena=a.size();
int lenb=k1.size();
for(int i=1;i<=lena;i++)a1[i]=a[lena-i]-'0';
for(int i=1;i<=lenb;i++)b1[i]=k1[lenb-i]-'0';
int l=1,x=0;
while(l<=lena||l<=lenb){
c1[l]+=a1[l]+b1[l];
x=c1[l]/10;
c1[l+1]+=x;
c1[l]%=10;
l++;
}
c1[l]=x;
while(c1[l]==0&&l>1)l--;
string q="";
for(int i=l;i>=1;i--)q+=c1[i]+'0';
k1=q;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string s=x(i);
m(s);
}
cout<<k1;
return 0;
}
by laotingrui @ 2024-10-13 22:06:43
@xuyi20110411 \ 看看我的\ 求关~~
#include<iostream>
using namespace std;
int c[505],ans[505],n,lc=1,la=1;
//高精度乘低精度
//不用重算阶乘,直接乘x
//例如:2!=1*2,3!=1*2*3=2!*3
void mul(int x){
for(int i=1;i<=lc;i++) c[i]*=x;//逐位相乘
//处理进位
for(int i=1;i<=lc;i++)
if(c[i]>=10){
//大于10,进位
c[i+1]+=c[i]/10;
c[i]%=10;
//判断最后是否还要再进一位
if(i==lc) lc++;
}
}
//高精度加高精度
void add(){
la=max(la,lc);//找最长的数
for(int i=1;i<=la;i++){
ans[i]+=c[i];//逐位相加
if(i==la&&ans[i]>=10) la++;//判断最后是否还要再进一位
ans[i+1]+=ans[i]/10;
ans[i]%=10;//处理进位
}
}
int main(){
cin>>n;
//c数组存放x的阶乘
c[1]=1;
for(int i=1;i<=n;i++){
mul(i);
add();
}
for(int i=la;i>=1;i--) cout<<ans[i];//输出
return 0;
}