C ++程序没有给出预期的输出

时间:2016-03-12 12:29:58

标签: c++

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

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

1 个答案:

答案 0 :(得分:2)

如果longint(因为返回值和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;
}
相关问题