在下面的C ++函数中,为什么numbers[max_index1]
转换为long long
然后再乘以numbers[max_index2]
?我想你会把数字乘以然后再投出?
使矢量数字类型为long long
而不是int
也没有意义,因此铸造不是必要的吗?
long long MaxPairwiseProductFast(const vector<int>& numbers) {
int n = numbers.size();
int max_index1 = -1;
cout << "value at max_index1 is " << numbers[max_index1] << std::endl;
for(int i = 0; i < n; i++)
if((max_index1 == -1) || (numbers[i] > numbers[max_index1]))
max_index1 = i;
int max_index2 = -1;
for(int j = 0; j < n; j++)
if((numbers[j] != numbers[max_index1]) && ((max_index2 == -1) || (numbers[j] > numbers[max_index2])))
max_index2 = j;
return ((long long)(numbers[max_index1])) * numbers[max_index2];
}
int main() {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
long long result = MaxPairwiseProductFast(numbers);
cout << result << "\n";
return 0;
}
((long long)(numbers[max_index1])) * numbers[max_index2];
在进行乘法运动之前,numbers[max_index2]
将被提升为long long
。如果你乘以两个int's
并且结果溢出,那么你可以通过将结果转换为long long
来实现任何目标,所以你先cast
,然后乘以。
将矢量数字类型设置为long long而不是int也没有意义,因此没有必要进行转换?
如果您知道单个数字符合int
,但两个int's
相乘的结果可能会溢出,这将有助于节省空间。
我想你会把数字乘以然后再投出?
想象一下,你的两个操作数具有值std::numeric_limits<int>::max()
。这是int
可以表示的最大值,并且(因为它是一个正整数),这个数字的平方结果甚至更大。
当你乘以两个int
值时,结果也是int
。请参阅here(特别是转换,整数提升和签名类型的溢出)。
由于定义结果大于您可以存储在int
中的最大值,因此使用int
s进行此乘法会得到未定义的结果。您需要使用足以存储结果的类型执行乘法运算。