以下是我的代码,其中我试图在单个数组传递中找到最大的成对产品:
// A O(n) C++ program to find maximum product pair in an array
#include <iostream>
#include <vector>
#include<conio.h>
using std::vector;
using std::cin;
using std::cout;
// Function to find maximum product pair in arr[0..n-1]
int MaxPairwiseProduct(const vector<long>& arr, int n) {
if (n < 2)
{
return -1;
}
if (n == 2)
{
return arr[0] * arr[1];
}
long posa = 0, posb = 0;
long nega = 0, negb = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
if (arr[i] < 0 && abs(arr[i]) > abs(nega))
{
negb = nega;
nega = arr[i];
}
else if (arr[i] < 0 && abs(arr[i]) > abs(negb))
negb = arr[i];
}
if (nega*negb > posa*posb)
return nega*negb;
else
return posa*posb;
}
int main() {
int n;
cin >> n;
vector<long> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
int result = MaxPairwiseProduct(numbers, n);
cout << result << "\n";
getchar();
return 0;
}
对于小数字来说,它完全没问题,但是当输入以下内容时:
输入:
2
100000 90000
输出是:
410065408
而不是
9000000000
我无法弄清楚这个输出是怎么来的,我甚至用long而不是int来处理大数。请帮助我。
答案 0 :(得分:2)
如果long
或int
(因为返回值和result
存储结果int
)在此环境中的长度为32位或更短,则会发生溢出
如果可以使用C ++ 11或更高版本,则将用于计算的数字类型替换为int64_t
。
#include <iostream>
#include <vector>
#include <cstdint> // add this to use int64_t
using std::vector;
using std::cin;
using std::cout;
// Function to find maximum product pair in arr[0..n-1]
int64_t MaxPairwiseProduct(const vector<int64_t>& arr, int n) {
if (n < 2)
{
return -1;
}
if (n == 2)
{
return arr[0] * arr[1];
}
int64_t posa = 0, posb = 0;
int64_t nega = 0, negb = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
if (arr[i] < 0 && abs(arr[i]) > abs(nega))
{
negb = nega;
nega = arr[i];
}
else if (arr[i] < 0 && abs(arr[i]) > abs(negb))
negb = arr[i];
}
if (nega*negb > posa*posb)
return nega*negb;
else
return posa*posb;
}
int main() {
int n;
cin >> n;
vector<int64_t> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
int64_t result = MaxPairwiseProduct(numbers, n);
cout << result << "\n";
getchar();
return 0;
}