【问题标题】:How to get rid of the arithmetic overflow如何摆脱算术溢出
【发布时间】:2020-06-03 09:34:43
【问题描述】:

这是代码中的三角形问题的代码,它给我一个算术溢出错误。

int solution(vector<int> &A) {

    int i, n;
    n=A.size();
    sort(A.begin(), A.end());
    for(i=0; i<n-2; i++)
    {
        if((A[i]+A[i+1]>A[i+2])&&(A[i]+A[i+2]>A[i+1])&&(A[i+1]+A[i+2]>A[i]))
        {
            return 1;
        }
    }
    return 0;
}

它通过了所有测试,除了“extreme_arith_overflow1 溢出测试,3 MAXINTs”说代码返回 0 但它期望 1。有人知道如何解决这个问题吗?

【问题讨论】:

  • 首先确保你没有超出你的向量范围。 (您将使用当前显示的代码执行此操作)其次,可能使用 unsigned int 代替,(如果没有值可以是负数)或者可能是 long long(或 unsigned long long)用于 64 位类型?此外,您可能应该进行一些输入验证,以确保您读取的输入一开始就有效。
  • 您将A.size() 存储在n 中,然后循环直到i&lt;n 并访问A[i+2]。在错误情况下,这是A[A.size()] 甚至A[A.size()+1]。超出范围。
  • @Someprogrammerdude 是的,谢谢我修复了越界问题并验证了输入:)

标签: c++ arithmetic-overflow


【解决方案1】:

您将A.size() 存储在n 中,然后循环直到i&lt;n 并访问A[i+2]。在错误情况下,这是A[A.size()] 甚至是A[A.size()+1]。已经越界了修正循环的范围。

当总和大于INT_MAX 时会出现下一个问题。使用差异而不是总和以避免溢出。请记住,元素是使用A[i] &lt;= A[i+1] &lt;= A[i+2] 排序的

int solution(vector<int> &A) {
    if (A.size() < 3) return 0;
    const auto n = A.size() - 2;
    std::sort(A.begin(), A.end());
    for(decltype(n) i = 0; i < n; ++i) {
        if((A[i]>A[i+2]-A[i+1])&&(A[i+2]>A[i+1]-A[i])&&A[i]>0) {
            return 1;
        }
    }
    return 0;
}

【讨论】:

  • 您好,感谢您的回答!修复了越界问题,但我似乎仍然遇到算术溢出错误。
  • 现在容易出现下溢。 :-) 考虑INT_MIN - 1.
  • @jvd 你在哪里看到下溢? A 已排序。 A[i+2]-A[i+1]A[i+1]-A[i] 返回正值。
  • @ThomasSablik 你是对的。我忘了A 已排序。
  • @UriRaz int i = 0; i &lt; A.size()-2 是一个隐式检查 A.size() 在循环之前至少为 3。当然你可以添加冗余检查。
猜你喜欢
  • 2011-11-07
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2017-05-23
相关资源
最近更新 更多