求助,最后一个测试点过不去,折腾半天好不容易把前3个过了...
查看原帖
求助,最后一个测试点过不去,折腾半天好不容易把前3个过了...
238203
跟你沟通楼主2023/2/8 19:12

代码如下

#include <iostream>
#include <string.h>
using namespace std;
int a[1003], b[1003], ans[1003];
int main() {
	int n, t = 0, la = 1, lb = 0, lans = 0;
	//ad用来存储进位的数
   cin >> n;
	a[0] = 1;
	for (t = 1; t <= n; ++t) {
		int x = 0, ad = 0;
		do {//半高精乘法---a*=t
			x = a[lb] * t + ad;
			b[lb] += x % 10;
			ad = x / 10;
			lb++;
		} while (lb<=la);//使用do...while是因为之前的代码有问题,后来没改,应该不影响
		ad = 0;//进位归0
		for (int i = 0; i <= lb; ++i) {//高精度加法将当前的阶乘累加到答案ans数组
			ans[i] += b[i] + ad;
			ad = ans[i] / 10;
			ans[i] %= 10;
		}
		for (int i = 0; i < lb; ++i)
			a[i] = b[i];//将b(当前的阶乘)复制到a以备下次循环
		la = lb;//a的长度也复制过去(可能不是实际长度,会更长)
		lb = 0;
		memset(b, 0, sizeof(b));//b和b的长度归0
	}
	lans = la;
	while (!ans[lans])
		lans--;//调整输出的范围
	for (int i = lans; i >= 0; --i)
		cout << ans[i];
	return 0;
}
2023/2/8 19:12
加载中...