繁体   English   中英

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

[英]C++ program not giving expected output

以下是我试图在单个数组遍中查找最大成对乘积的代码:

// 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

我无法弄清楚输出结果如何,我什至用int代替int来处理大量数字。请帮帮我。

溢出会发生,如果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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM