高精度把我这个蒟蒻干傻了(求调
查看原帖
高精度把我这个蒟蒻干傻了(求调
1421656
little_q_exist楼主2024/10/20 10:50

代码如下,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;
}
2024/10/20 10:50
加载中...