代码如下,WA on #3 #4
#include<iostream>
#include<cstring>
using namespace std;
int a[52*2],b[52*2],c[52*4],d[52*4],f[52*4+10];
// a数组输入i++,c数组为相乘结果,放入b数组继续相乘。f数组储存相加结果,(d数组没什么用但是并不妨碍我写出一堆bug
int alen = 1,blen = 1,clen = 1,dlen = 1,flen = 1;
void add(){
for (int j = 0;j<blen;j++)
{
f[j] += b[j]; // 加法
}
flen = blen;
for (int i = 0;i<flen;i++)
{
if (f[i]>9) //进位
{
f[i+1] += (f[i]/10);
f[i] %= 10;
}
}
while (f[flen+1])
{
flen ++; // 调整位数,防止漏进位
}
}
void flatten(int n){ // 把a“铺开”并进位
a[0] = n;
for (int i = 0;i<alen;i++)
{
if (a[i]>9)
{
a[i+1] += (a[i]/10);
a[i] %= 10;
if (i + 1 == alen)
{
alen ++;
}
}
}
}
void mult(int k){ // 乘法
flatten(k);
for (int i = 0;i<alen;i++)
{
for (int j = 0;j<blen;j++)
{
c[i+j] += a[i] * b[j];
}
}
clen = alen+blen;
for (int i = 0;i<clen;i++)
{
if (c[i]>9)
{
c[i+1] += (c[i]/10);
c[i] %= 10;
}
}
for (int i = 0;i<clen;i++)
{
b[i] = c[i];
}
blen = clen;
memset(c,0,sizeof(c));
}
int main(){
b[0] = 1;
int n;
cin>>n;
for (int i = 1;i<=n;i++)
{
mult(i);
add();
}
while (!f[flen] && flen>=1)
{
flen --;
}
for (int i = flen;i>=0;i--)
{
cout<<f[i];
}
cout<<endl;
return 0;
}