1

你好,我是一名业余程序员,更糟糕的是,我已经有一段时间没有进行任何编程了,所以我决定用一些简单的 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;


}
4

3 回答 3

4

您的程序中有逻辑错误。改变这个:

truncatedPercentage = points[i]/totalPoints;

对此:

truncatedPercentage = points[i] * 100 / totalPoints;

否则,百分比几乎总是 0,而percentageLeft100。这就是为什么percentage[percentage.size() - i] += 1AndersK 在我之前已经发现了段错误。该指数通常为负数。

也就是说,我不确定混合推回和直接分配是否会给你在这里可以拥有的最易读的代码。

于 2012-06-04T06:51:41.987 回答
3

大概在这里

for (int i = 1;i <= percentageLeft; ++i)
{
    percentage[percentage.size() - i] += 1;
}

如果percentageLeft大于向量的大小。如果i超过向量的大小,则您在其内存位置之前读取会导致访问冲突(段错误)。

于 2012-06-04T05:55:17.107 回答
1
percentage[percentage.size() - i] += 1;

std::map会比std::vector“百分比”更好地满足您的目的。

于 2012-06-04T06:08:37.377 回答