【问题标题】:How to get largest value after leaving one array value?保留一个数组值后如何获得最大值?
【发布时间】:2015-09-12 03:42:09
【问题描述】:

我目前在从数组中获取最大值时遇到问题,这是我的代码:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    int a[10],max=0,j,secondbig=0;
    for(int i=0;i<10;i++)
        {
        cin>>a[i];

    }
    max = a[0];
    for(int i=0;i<10;i++)
        {
        if(a[i]>max){
            max=a[i];
            j=i;
        }
    }
    secondbig=a[10-j-1];
    for(int i=0;i<10;i++)
        {
        if(secondbig <a[i] && j != i)
          secondbig =a[i];
    }
    cout<<max<<"\n"<<secondbig;
    return 0;
}

我想要做的是首先从一个数组中获取最大值,然后留下一个数组值,然后得到第二个最大值,第三个最大值相同,例如:

200
100
50
300
400
500
600
700
800
900

如果在上面的测试值中900是最大值,那么接下来的第二和第三个最大值应该是700和500,有什么办法吗?

【问题讨论】:

标签: c++ arrays algorithm


【解决方案1】:

也许你可以对数组进行排序

int *pbeg = begin(a);
int *pend = end(a);
sort(pbeg, pend);

这将使用运算符

【讨论】:

    【解决方案2】:

    鉴于您的原始代码,我认为这是您尝试的风格。它将返回三个最高值。请注意,您只需要创建一个循环来重复初始计算。您希望最大剩余值小于先前的最大值。

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <limits>
    using namespace std;
    
    
    int main()
    {
        int a[10], max, prior_max = numeric_limits<int>::max();
        for(int i=0;i<10;i++)
            {
            cin>>a[i];
    
        }
      for( int j = 0; j<3; j++){
        max = numeric_limits<int>::min();
        for(int i=0;i<10;i++)
            {
            if(a[i]>max && a[i]<prior_max){
                max=a[i];
            }
        }
        cout << max << endl;
        prior_max = max;
    
      }
      return 0;
    }
    

    【讨论】:

    • 如果我想添加从中获得的所有最大值该怎么办?
    • 看我的第二个答案。 (由于您发布问题时我所在时区的时间,我没有尽快回复您的后续问题。)
    【解决方案3】:

    假设您很高兴获得适当的值,我会使用向量。

    std::sort(std::begin(a), std::end(a), std::greater<int>());
    

    然后打印或复制数组的第一个 n 元素(假设 n 不超过您的数组大小,10)。它们将按相反的顺序排列,但这很容易纠正。

    【讨论】:

      【解决方案4】:

      根据您的后续问题,如果您想列出所有最大值,请将 j

      int a[10], total, max, prior_max = numeric_limits<int>::max();
      

      然后在外循环中,将以下语句放在内循环的末尾:

      total += max;
      

      然后在循环执行完成后,您可以打印出总数或以其他方式使用它。如:

      cout << 'Total: ' << total << endl;
      

      【讨论】:

      • 谢谢,但为什么它给出 900、800 和 700 但我想要 900、800 和 500 作为输出?
      • 规范要求前 3 个值作为递减值的输出。您的样本数据为:200、100、50、300、400、500、600、700、800、900。基于规格的输出为 900、800、700;因为它们是样本总体中最高的 3 个值;这就是正在交付的东西。您声明您希望输出为 900、800 和 500;该声明与规格和示例数据的组合不一致。
      • 实际上,即使您在评论中声明您希望输出为 900、800 和 500,也与您第一个预期输出 900、700、500 的声明不一致。这是正确的期望输出,您的预期输出的第一个版本或您的第二个版本,或者规格要求什么?如果是规格,它已经交付。如果是预期输出的语句之一,那是哪一个?
      • 你会继续这一系列的问题吗,在这里还是在你也在这个主题上运行的并行问题线程中? *.com/questions/32535874/…