为什么定义数组的顺序不同会导致不同的错误?
  • 板块学术版
  • 楼主GTGumiiL
  • 当前回复13
  • 已保存回复13
  • 发布时间2022/12/2 09:10
  • 上次更新2023/10/27 00:47:05
查看原帖
为什么定义数组的顺序不同会导致不同的错误?
318996
GTGumiiL楼主2022/12/2 09:10

如题,鄙人昨天在写P1045 [NOIP2003 普及组] 麦森数的时候因为数组定义顺序的区别导致一个能够ac,一个连正确答案都无法输出。

我定义了三个数组,一个的顺序是先power2,再res,最后mul。这个代码就可以AC这道题。但是,如果我定义的顺序为先power2,再mul,最后res,这样输出答案的时候连样例都不会过。

对于第一份代码,我开1e3+101e3 + 10的空间就能过,但是第二份代码不管开多大都会存在数组越界(比如1e81e8),就这让我看了一个小时都没找到问题出在哪个地方。我打死也不会想到是数组定义的顺序不同就会导致这么神奇的结果。

有没有大佬知道是什么原因吗?

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
//int power2[N], res[N], mul[N];(可AC)
int power2[N], mul[N], res[N];
int n;
int main() {
	scanf("%d", &n);
	printf("%d", (int)(log10(2) * n + 1));
	res[1] = 1;
	power2[1] = 2;
	while (n != 0) {
		if (n % 2 == 1) {
			memset(mul, 0, sizeof mul);
			for (int i = 1; i <= 500; i++)
				for (int j = 1; j <= 500; j++)
					mul[i + j - 1] += res[i] * power2[j];
			for (int i = 1; i <= 500; i++) {
				mul[i + 1] += mul[i] / 10;
				mul[i] %= 10;
			}
			for (int i = 0; i <= N * 2; i++) res[i] = mul[i];
		}
		n /= 2;
		memset(mul, 0, sizeof mul);
		for (int i = 1; i <= 500; i++) 
			for (int j = 1; j <= 500; j++)
				mul[i + j - 1] += power2[i] * power2[j];
		for (int i = 1; i <= 500; i++) {
			mul[i + 1] += mul[i] / 10;
			mul[i] %= 10;
		}
		for (int i = 0; i <= N * 2; i++) power2[i] = mul[i];
	}
	res[1] -= 1;
	for (int i = 500; i >= 1; i--) {
		if (i % 50 == 0) printf("\n%d", res[i]);
		else printf("%d", res[i]);
	}
	return 0;
}
2022/12/2 09:10
加载中...