C++程序未提供预期的输出

C++ program not giving expected output

本文关键字:输出 程序 C++      更新时间:2023-10-16

以下是我的代码,我试图在单个数组传递中找到最大成对乘积:

// 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 来处理大数字。请帮助我。

如果此环境中的longint(因为存储结果的返回值和result int)长度为 32 位或更短,则会发生溢出。

将用于计算的数字类型替换为int64_t是否可以使用 C++11 或更高版本。

#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;
}