你好我是一名业余程序员,为了让它变得更糟,我已经做了一段时间的编程,所以我决定用一些简单的Topcoder问题刷新我的记忆。我做的第一个最终是一个段故障,现在这超出了我能为自己找到的,任何人都可以帮助我理解段故障的来源。这是代码。
vector<int> Bonuses (vector<int> points)
{
int totalPoints = 0;
for (int i = 0; i != points.size(); ++i)
{
totalPoints += points[i];
}
vector<int> percentage;
int percentageLeft = 100;
int truncatedPercentage;
for (int i = 0; i != points.size(); ++i)
{
truncatedPercentage = points[i]/totalPoints;
percentage.push_back(truncatedPercentage);
percentageLeft -= truncatedPercentage;
}
for (int i = 1;i <= percentageLeft; ++i)
{
percentage[percentage.size() - i] += 1;
}
return percentage;
}
答案 0 :(得分:4)
您的程序中存在逻辑错误。改变这个:
truncatedPercentage = points[i]/totalPoints;
到此:
truncatedPercentage = points[i] * 100 / totalPoints;
否则百分比几乎总是0,而percentageLeft
将是100.这就是为什么percentage[percentage.size() - i] += 1
像AndersK在我之前找到的那样是segfaulting。该指数通常为负数。
那就是说,我不确定混合回击和直接赋值是否为您提供了最具可读性的代码。
答案 1 :(得分:3)
可能在这里
for (int i = 1;i <= percentageLeft; ++i)
{
percentage[percentage.size() - i] += 1;
}
如果percentageLeft
大于向量的大小。如果i
超出了向量的大小,那么就比在内存位置之前读取导致访问冲突(segfault)。
答案 2 :(得分:1)
percentage[percentage.size() - i] += 1;
对于&#39;百分比&#39; std::map
比std::vector
更能满足您的目的。