如何摆脱算术溢出
How to get rid of the arithmetic overflow
这是编码中三角形问题的代码,它给我带来了算术溢出错误。
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 个 MAXINT"之外的所有测试,表示代码返回 0,但它期望 1。有人知道如何解决这个问题吗?
您将A.size()
存储在n
中,然后循环直到i<n
并访问A[i+2]
。在错误情况下,这是A[A.size()]
甚至A[A.size()+1]
。这是越界的。修复循环的范围。
当总和大于INT_MAX
时,会出现下一个问题。使用差额而不是总和以避免溢出。请记住,元素按A[i] <= A[i+1] <= 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;
}
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- Python中的for循环与C++有何不同
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 尝试摆脱任何堆内存分配
- 如何摆脱C ++中的分段错误错误?
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 在 c++ 中使用 vtd-xml 时,如何摆脱 EOFException?
- 如何摆脱为条件编译定义预处理器宏的需要?
- 如何摆脱算术溢出
- 堆栈溢出错误 c++.我如何修改/修复此代码以摆脱此问题
- C++标准对堆栈溢出有何规定