对于非常大的输入,缺少和重复 1..n 的数字数组.使用1..n系列特性的解决方案.溢出问题
Missing and repeating number array from 1...n for very large inputs. Solution using properties of 1...n series. Overflow issues
这是同一网站为 https://www.interviewbit.com/problems/repeat-and-missing-number-array/提供的代码:
vector<int> repeatedNumber(const vector<int> &V) {
long long sum = 0;
long long squareSum = 0;
long long temp;
for (int i = 0; i < V.size(); i++) {
temp = V[i];
sum += temp;
sum -= (i + 1);
squareSum += (temp * temp);
squareSum -= ((long long)(i + 1) * (long long)(i + 1));
}
// sum = A - B
// squareSum = A^2 - B^2 = (A - B)(A + B)
// squareSum / sum = A + B
squareSum /= sum;
// Now we have A + B and A - B. Lets figure out A and B now.
int A = (int) ((sum + squareSum) / 2);
int B = squareSum - A;
vector<int> ret;
ret.push_back(A);
ret.push_back(B);
return ret;
}
现在,我编写了类似的代码,但没有类型转换,它为较大的输入返回错误。谁能解释一下类型转换如何解决溢出问题?
另外,我看到了这个问题的XOR方法,但不知道位操作问题。如果有人可以帮助我提供一些链接/资源来处理使用位操作方法处理问题,那就太好了!
感谢您阅读我的问题并想提供帮助!干杯!
(i + 1) * (i + 1)
将以int
算术进行评估,并有可能溢出,其行为尚未定义。
写作
((long long)(i + 1) * (long long)(i + 1));
是消除这种影响的冗长方法;你可以使用更清晰的
(i + 1LL) * (i + 1)
相反,这会导致其他术语的转换。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 如何在 setup() 函数中使用数字引脚转动电机?
- 使用数字初始化常量引用
- C :是否值得使用static_cast避免使用数字的条件
- C++ 使用数字删除文件 io 行
- 使用数字列表和算术运算获取目标数字
- 设置::使用数字中的引号进行向量初始化
- 正则表达式使用数字作为标记拆分单词
- C 如何结束一个段循环,该循环添加数字而不使用数字作为触发器来结束循环
- 声明常数或在代码中使用数字
- "if (var)"使用数字转换而不是布尔值
- 如何最大限度地使用数字0来优化程序
- 如何使用数字1到26显示一个复杂度的字符
- C++ 仅使用数字(双精度)的读入文件
- 十六进制或二进制数中的数字前是否允许使用数字分隔符
- 使用数字和字符操作符创建表达式
- 使用C数字进行错误检查
- 使用数字上下控制图像的亮度