C++ 2个数组中最大元素的乘积

C++ 2个数组中最大元素的乘积,c++,arrays,C++,Arrays,我试图从2个动态分配的数组中得到最大的非相等元素的乘积 (例如,如果数组1为:7,5,9,数组2为:8,9,1,则乘积应为9*8=72)。 然而,结果对我来说永远都不准确,我开始调试,但也无法找出问题所在 请在下面找到我的代码 #include <iostream> using namespace std; int main() { int size; cin >> size; int *arr1 = new int[size]; i

我试图从2个动态分配的数组中得到最大的非相等元素的乘积 (例如,如果数组1为:7,5,9,数组2为:8,9,1,则乘积应为9*8=72)。 然而,结果对我来说永远都不准确,我开始调试,但也无法找出问题所在

请在下面找到我的代码

#include <iostream>
using namespace std;

int main()
{
    int size;
    cin >> size;

    int *arr1 = new int[size];

    int *arr2 = new int[size];

    int max1;
    int max2;
    max1 = 0;
    max2 = 0;

    for (int i = 0; i < size; i++)
    {
        cout << "Please enter the elements for first array" << endl;
        cin >> arr1[i];
    }

    for (int k = 0; k < size; k++)
    {
        cout << "Please enter the elements for second array" << endl;
        cin >> arr2[k];
    }

    for (int l = 0; l < size; l++)
    {
        if(arr1[l]>max1)
        {
            max1 = arr1[l];
        }
    }

    for (int j = 0; j < size; j++)
    {
        if (arr2[j]>max2 && arr2[j]!=max1)
        {
            max2 = arr1[j];
        }
    }

    int product;
    product = max1*max2;

    cout << "product is = " << product << endl;

    delete []arr1;
    delete []arr2;
}
#包括
使用名称空间std;
int main()
{
整数大小;
cin>>尺寸;
int*arr1=新int[size];
int*arr2=新的int[size];
int-max1;
int-max2;
max1=0;
max2=0;
对于(int i=0;imax1)
{
max1=arr1[l];
}
}
对于(int j=0;jmax2&&arr2[j]!=max1)
{
max2=arr1[j];
}
}
int产品;
产品=max1*max2;

cout您的尝试中有几个错误:

  • 一个可能是输入错误,如第二个
    中的
    if
    max2=arr1[j];
    应该是
    max2=arr2[j];
  • 另一个是概念性的:你没有考虑到两个负数的乘积是正的;然而,这可能只是你的选择;从第3点来看,这并不是真正相关的;但是我将它改写为一个问题:负数呢
  • 另一个bug(我认为是主要bug)是概念性的:如果
    arr1
    arr2
    具有相同的最大条目,那么您必须以某种方式选择从哪个条目中放弃最大值以获取第二大条目。您的代码总是选择从
    arr1
    中获取最大值;例如,如果
    arr1
    [1,2,3]
    arr2
    [0,1,3]
    你最终会从
    arr1
    中选择
    3
    ,从
    arr2
    中选择
    1
    。但是如果你从
    arr2
    中选择了最大值,那么你最终会从
    arr1
    中选择
    2
    ,从
    arr2
    中选择
    3
    :哪一个更好?没有人能说,因为这个问题无法回答做出选择
  • 事实上,Bug3和相关的例子只是揭示了问题的陈述(请求,如果你愿意的话)本身是错误的

    一般来说,您可以在同一行中声明和初始化变量,这对于您了解这一点非常有用,如:

    int max1 = 0;
    
    而不是

    int max1;
    max1 = 0;
    

    对数组进行排序并比较最大的元素。如果它们相同,则返回一个最大元素和一个第二大元素的最大乘积:

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int size;
        cin >> size;
    
        int *arr1 = new int[size];
    
        int *arr2 = new int[size];
    
        for (int i = 0; i < size; i++)
        {
            cout << "Please enter the elements for first array" << endl;
            cin >> arr1[i];
        }
    
        for (int k = 0; k < size; k++)
        {
            cout << "Please enter the elements for second array" << endl;
            cin >> arr2[k];
        }
    
        std::sort(arr1, arr1 + size);
    
        std::sort(arr2, arr2 + size);
    
        cout << "product is = ";
        if (arr1[size-1] != arr2[size-1])
            cout << arr1[size-1] * arr2[size-1] << endl;
        else
            cout << std::max(arr1[size-1] * arr2[size-2], arr1[size-2] * arr2[size-1]) << endl;
    
        delete []arr1;
        delete []arr2;
    }
    
    输出:

    product is = 72
    

    好的,代码中有两个概念问题:

    你们假设你们至少会得到一个正数,但要求并没有说明。若所有的数字都是负数,你们会得到错误的结果

    2您查找的最大数字是错误的,假设您有2个数组:[7,8,9]和[6,7,9],您将给出9*7而不是8*9

    以下是正确的解决方案:

    std::vector<int> v1( size ), v2( size );
    
    // make sure that size >= 2 and enter data
    
    std::nth_element( v1.begin(), v1.begin() + 1, v1.end(), std::greater<int>() );
    std::nth_element( v2.begin(), v2.begin() + 1, v2.end(), std::greater<int>() );
    
    int product = v1[0] * ( v1[0] == v2[0] ? std::max( v1[1], v2[1] ), v2[0] );
    
    std::向量v1(大小),v2(大小);
    //确保大小>=2并输入数据
    std::n_元素(v1.begin(),v1.begin()+1,v1.end(),std::greater());
    std::n_元素(v2.begin(),v2.begin()+1,v2.end(),std::greater());
    int product=v1[0]*(v1[0]==v2[0]?std::max(v1[1],v2[1]),v2[0]);
    
    谁说这些数组的元素总是正数?@ThomasSablik数字不能重复,我需要从每个数组中取最大值,但不能相等,所以在第二个数组中,我取第二大元素讽刺的是,考虑到输入顺序,你一开始就不需要数组。只要读f第一组数字,并在读取时确定最大值。一旦您知道某个项目没有替换当前最大值,您就不再需要它。对第二组数字重复该操作。然后,将两个结果相乘,您就有了答案。“数字不能重复”在人们研究你的解决方案之前,你应该说所有的需求。它是否说数字总是正的?@Slava我在需求“非相等元素”中提到过,从语言上讲,它给出了“非重复”的相同含义。简单的测试用例{10,9}和{10,5}产生错误的输出。@TruthSeeker,问题是关于两个动态分配数组中最大的非相等元素的乘积。因此,参考您的示例,
    10*5
    与[…]的乘积既不正确也不错误不一定存在,你的例子正好证明了这一点。但是我在我的答案中列出了这个概念性错误。@TruthSeeker会给你10*10,这是不正确的。@TruthSeeker,你能不能花一分钟或更短的时间看看我的更新答案?给我的教训:永远不要回答错误的问题。你的第2点似乎不正确(我对此也感到困惑)OP正在寻找两个最大(不相等)的产品元素,不是最大的乘积。这个问题从来没有提到最大的乘积,所以
    9*7
    vs
    8*9
    是不相关的。没有一个是对的或错的,因为这个问题被窃听了,所以没有合适的解。@EnricoMariaDeAngelis是对的,但是8和9个最大的元素大于9和7。所以我支持它,但是r“如果两个元素不相等,那么从两个向量中取最大的两个元素只有一种方法”,我同意“这是一个逻辑上的荒谬现象。”@EnricoMariaDeAngelis你从哪里得到这句话的?问题是从2[…]中得到最大不相等元素的乘积数组。get表示乘积存在,因此两个数字存在。larg est表示有一种唯一的方法来选择这两个元素。无法为{9,8,5}和{9,8,6}@TruthSeeker生成正确的o/p,结果是9*8=72。9和8是la
    std::vector<int> v1( size ), v2( size );
    
    // make sure that size >= 2 and enter data
    
    std::nth_element( v1.begin(), v1.begin() + 1, v1.end(), std::greater<int>() );
    std::nth_element( v2.begin(), v2.begin() + 1, v2.end(), std::greater<int>() );
    
    int product = v1[0] * ( v1[0] == v2[0] ? std::max( v1[1], v2[1] ), v2[0] );