如何摆脱算术溢出

问题描述 投票:-2回答:1

这是针对三角问题的代码,它向我抛出算术溢出错误。

int solution(vector<int> &A) {

    int i, n;
    n=A.size();
    sort(A.begin(), A.end());
    for(i=0; i<n; 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个MAXINT's表示代码返回0,但它期望为1。任何人都知道如何解决此问题?

c++ codility arithmetic-overflow
1个回答
0
投票

您将A.size()存储在n中,然后循环播放直到i<n并访问A[i+2]。在错误情况下,这是A[A.size()]甚至是A[A.size()+1]。超出范围。固定循环范围:

int solution(vector<int> &A) {

    int n = A.size();
    std::sort(A.begin(), A.end());
    for(int 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;
}

当总和大于INT_MAX时,发生下一个问题。使用差异而不是总和来避免溢出。

© www.soinside.com 2019 - 2024. All rights reserved.