您好,我是一名业余程序员,更糟糕的是,自从我完成任何编程以来已经有一段时间了,所以我决定通过一些简单的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;
}
最佳答案
您的程序中存在逻辑错误。更改此:
truncatedPercentage = points[i]/totalPoints;
对此:
truncatedPercentage = points[i] * 100 / totalPoints;
否则,百分比将几乎始终为0,而
percentageLeft
将为100。这就是percentage[percentage.size() - i] += 1
进行段错误检查的原因,因为AndersK在我之前已经发现过。该指数通常为负。就是说,我不确定混合使用推回和直接分配是否可以为您提供可读性最高的代码。