【发布时间】:2021-08-04 16:02:34
【问题描述】:
你必须计算一个序列的第 n 项,因为 n 非常大,并且必须尽可能快地完成。
系列由以下函数定义:
f(0) = 1
f(1) = 1
f(2n) = f(n)
f(2n+1) = f(n) + f(n-1)
我知道我必须使用记忆。我做了这段代码,但问题是大 n 值会导致分段错误。我想尝试做一个 2 值数组版本(如回复 here 中描述的那个),但我没有找到正确的解决方案。
uint64_t f(uint64_t n)
{
uint64_t a[n+2];
uint64_t i;
a[0] = 1;
a[1] = 1;
for(i = 2; i <= n; i++)
{
if (i % 2 == 0)
{
a[i] = a[i / 2];
}
else
{
a[i] = a[i / 2] + a[(i / 2) - 1];
}
}
return a[n];
};
【问题讨论】:
-
n的什么值导致设置错误? -
Variable-Length Array 像
uint64_t a[n+2];不在标准 C++ 中。 -
我也尝试过使用 unsigned long long。值大于 100000 左右时会发生分段错误。
-
使用
std::vector<uint64_t> a(n+2);而不是uint64_t a[n+2]; -
向量有帮助,但是当 n 真的很大时,代码也会死掉。