我通过以下函数得到了错误的答案。
vector<int> repeatedNumber(const vector<int> &A) {
int n = A.size();
long long linear_sum = 0,square_sum = 0;
int i = 0;
for(;i<n;i++){
linear_sum += A[i]; //LINE 1
square_sum += A[i]*A[i]; //LINE 2
}
linear_sum = linear_sum - (n*(n+1))/2;
square_sum = square_sum - (n*(n+1)*(2*n+1))/6;
square_sum /= linear_sum;
vector<int> ans;
ans.push_back((linear_sum+square_sum)/2);
ans.push_back((-linear_sum+square_sum)/2);
return ans;
}
但是当我将 LINE 1 和 LINE 2 替换为:
linear_sum += (long long)A[i];
square_sum += (long long)A[i]*(long long)A[i];
我得到了正确的答案。为什么只需将 int 类型转换为 long long 就可以解决问题。
最佳答案
当你将两个 int
相乘时values 结果计算为 int
.
如果相乘后的值对于 int
来说太大了你会得到“未定义的行为”(在大多数常见的硬件中你只会得到一个看似随机的结果)。
例如33554432
(即 1<<25
== 225)对于 32 位整数是可以的,但它的平方 1125899906842624
(即 250)不是。
转换为 long long
计算乘法之前的项,您希望扩大正确完成计算的范围。
这些问题在原生提供任意精度整数的语言(如 Python 或 Lisp)中不存在。
注意 int
是可能的和 long long
大小确实相同(您只能确定 long long
不小于 int
)。
关于c++ - 在计算过程中将 int 类型转换为 long long 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630643/