数组定义到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