在计算过程中将int类型转换为long long的优点是什么?
What is the advantage of typecasting int to long long during calculations?
我得到了错误的答案下面的函数。
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;
}
但是当我将第一行和第二行替换为:
linear_sum += (long long)A[i];
square_sum += (long long)A[i]*(long long)A[i];
我得到了正确答案。为什么只需将int类型转换为long long就可以解决问题呢?
当您将两个int
值相乘时,结果将计算为int
。
如果值相乘时太大的int
你得到"未定义的行为"(在最常见的硬件,你只是得到一个看似随机的结果)。
例如33554432
(即1<<25
== 225)对于32位整数是可以的,但它的平方1125899906842624
(即250)就不行。
在计算乘法之前将项强制转换为long long
,希望可以扩大正确计算的范围。
这些问题在原生提供任意精度整数的语言(如Python或Lisp)中不存在。
请注意,int
和long long
确实是相同的大小(您只能确定long long
不小于比int
)。
关键在这里:
A[i]*A[i]
这个值可能太大,溢出int
,然后才转换为long long
,但是。
(long long)A[i]*(long long)A[i];
首先被转换,然后相乘,并且不能溢出long long
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual Studio 2008下使用long long int的编译器错误的原因是什么?
- " long unsigned typedef int long ullong; "是什么意思?
- c++中计算long long int型整型的绝对值最快的方法是什么?
- 在计算过程中将int类型转换为long long的优点是什么?