【发布时间】:2015-06-02 17:55:19
【问题描述】:
我收到以下代码的分段错误。这是the SPOJ problem "Coins"的解决方案。
我检查了How to avoid SIGSEGV?,并确保不要使用未初始化的指针,不要访问内存不足等(给定 n ≤ 109)。
我知道数组a[1000000000] 会导致堆栈溢出,所以我使用了std::map。 std::map 会导致堆栈溢出吗?我的代码有什么问题?
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
map<unsigned long long int, unsigned long long int> a;
unsigned long long int dp(unsigned long long int n)
{
if (a.find(n) == a.end())
a[n] = dp(n/2) + dp(n/3) + dp(n/4);
return a[n];
}
int main()
{
for (unsigned long long int i = 1; i <= 24; i++) {
a[i] = i;
if (i == 12 || i == 24)
a[i] = i + 1;
}
unsigned long long int n = 0;
cin >> n;
while (!feof(stdin)) {
printf("%llu\n", dp(n));
cin >> n;
}
}
【问题讨论】:
-
@Michelle 确定是的。看
main()开头的for循环 -
@Michelle : 我让它全球化了
-
如果你有 10^9 long long's 那么这将占用超过 7GB 的内存。你有多少内存?
-
你的缩进很奇怪
标签: c++ segmentation-fault maps dynamic-programming