为什么这样会RE(已经放弃思考了)(本地都是对的)

P1010 [NOIP1998 普及组] 幂次方

数组定义到20,然后i<=20是吧
by 飞风追云 @ 2023-06-23 18:58:16


一般而言越界一点没有问题,但是`x`是直接定义于`e[20]`后的,也就是说访问`e[20]`会访问到`x`,造成无限循环。将数组开大或将`x`定义与`main`中都可解决。
by 0x282e202e2029 @ 2023-06-23 19:06:56


@[Yejiacheng](/user/793427) AC了,谢谢
by yansayan @ 2023-06-23 19:15:45


@[Yejiacheng](/user/793427) 访问 `e[20]`不一定会访问到 `x`,你可以试试一些 Windows 环境和 Linux 环境,似乎排列变量位置都是截然相反的。这是当然是一个未定义行为,请不要脑补结果。
by Terrible @ 2023-06-23 20:38:42


但我的编译器是啊,我试着用洛谷编译器编译,发现`x`一直是$1048576$(即$2^{20}$),也就是说`e[20`访问到了`x`。不同编译器结果不同,确实不建议使用未定义行为,**数组一定要开够的**,我只是给出了一种奇怪的解决方式(
by 0x282e202e2029 @ 2023-06-23 20:54:51


常用的编译器(比如我用的Dev-C++)的确将`x`的位置排在了后面,总之**数组一定要开够**,这是最基础的,**我对此不表示反对**。而且本题数据范围不用计算至$2^{20}$,$14$次方足矣,这是另一种解决方法。
by 0x282e202e2029 @ 2023-06-23 20:59:20


```cpp #include <bits/stdc++.h> using namespace std; #define l(x) (1 << x) #define ll long long string mem[20005]; string dfs(ll n) { string Pow = "(0)"; if (n == 0) { //cout << "n = 0!" << endl; return "0"; } if (n == 1) { return "2" + Pow; } if (n == 2) { return "2"; } ll p = 0, t = n; while (t > 1) { t >>= 1;//t÷2 p++; } if (l(p) == n) { if (mem[n] != "") { return mem[n]; } string t = "2(" + dfs(p) + ")"; mem[n] = t; //cout << t << " " << p << endl; return t; } else { if (mem[n] != "") { return mem[n]; } //cout << p << "dd" << endl; string t = dfs(l(p)) + "+" + dfs(n - l(p)); mem[n] = t; return t; } //cout << "1" << endl; return "Error!"; } int main() { ll n; cin >> n; string ans = dfs(n); cout << ans << endl; return 0; } ```
by 13704085069a @ 2023-07-18 13:35:28


---------阿深V介绍客户公司法律各暗示法哈酒UIgsajkf3134 发GVamigla打撒交付物2
by yzx123456789 @ 2023-09-04 13:05:15


|