查找数组中的最大和最小数字

时间:2017-11-25 00:45:37

标签: c++ arrays random

我正在使用C ++程序将随机值存储在1000大小的数组中。 然后程序会要求用户输入X' X'最大的' Y'最小的数字。 ' X'和' Y'是小于数组大小的任何整数值。 程序将输出' X'最大的' Y'数组中的最小数字。

假设数组有1 2 4 7 9 14 3

X = 2

Y = 3

输出

数组中最大的2个数字是14 9

数组中最小的3个数字是1 2 3

#include<iostream>
using namespace std;
int main()
{
   int size[1000];
   int x, y, max;
    max = 0;
    cout << "How many Largest numbers do you need ?\n";
    cin >> x;
    cout << "How many Smallest numbers do you need ?\n";
    cin >> y;
        for (int i = 0;i <= 999;i++)
        {
            size[i] = rand() % 100;
            cout << "No." << i << " = " << size[i] << endl;
        }
        for (int j = 1;j <= x;j++)
        {

            for (int i = 0;i <= 999;i++)
            {
                if (size[i] > max)
                    max = size[i];
            }
            cout << "LARGEST NUMBERS\n" << max << endl;
        }
}

2 个答案:

答案 0 :(得分:1)

您的错误可能来自于每次迭代后您没有重置max的事实。这很难分辨,因为你没有真正提出任何要求。

试试这个:

    for (int j = 1;j <= x;j++)
    {
        max = size[0];
        for (int i = 1;i <= 999;i++)
        {
            if (size[i] > max)
                max = size[i];
        }
        cout << "LARGEST NUMBERS\n" << max << endl;
    }

为最小输出实现类似的嵌套for循环。

这是一个已经过测试的基于列表的版本。

#include <iostream>
#include <list>

int main()
{
  std::list<int> intList;
  int x, y;

  std::cout << "How many Largest numbers do you need ?\n";
  std::cin >> x;
  std::cout << "How many Smallest numbers do you need ?\n";
  std::cin >> y;

  for (int i = 0;i <= 9;i++)
    {
      auto a = rand() % 100;
      intList.push_back(a);
      std::cout << "No." << i << " = " << a << std::endl;
    }
  for (auto j = intList.end(); j != intList.begin();)
    {
      std::cout << "Listdump: " << *--j << std::endl;
    }

  intList.sort();
  int count2x = 0;
  for (auto j = intList.end(); j != intList.begin();)
    {
      if (count2x == x) {break;}
      std::cout << "LARGEST NUMBERS\n" << *--j << std::endl;
      count2x++;
    }
}

答案 1 :(得分:-1)

以下是使用std::set的解决方案。由于std::set已经对其条目进行了排序,而且不存储重复项,因此解决方案变得非常简单:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <set>

int main()
{
   int size[1000];
   int x, y;
   std::cout << "How many Largest numbers do you need ?\n";
   std::cin >> x;
   std::cout << "How many Smallest numbers do you need ?\n";
   std::cin >> y;

   srand(0);  // seed random number

   // generate the numbers in the array
   std::generate(size, size + 1000, []{return rand() % 1000;});

   // create a std::set consisting of the numbers in the array
   std::set<int> intSet(size, size + 1000);

std::generate功能自动&#34;循环&#34;并使用随机值填充数组。

std::set<int>构造函数只是使用数组中的值创建std::set。请注意,这将自动排序和删除重复的条目。

完成此操作后,只需打印出x中的第一个y号码和最后std::set个号码即可。

   // print the smallest numbers
   auto iter1 = intSet.begin();  // beginning of the set
   int i = 0;
   while (i < y)
   {
       std::cout << *iter1 << " ";
       ++iter1;
       ++i;
   }
   std::cout << "\n";

   // print the largest numbers
   auto iter2 = intSet.rbegin();  // end of the set.  We will loop backwards
   i = 0;
   while (i < x)
   {
       std::cout << *iter2 << " ";
       ++iter2;
       ++i;
   }
}

从集合的末尾开始向后打印最大的数字,这就是使用反向迭代器的原因。

注意:您必须在打印出值的循环中放置检查,以确保迭代器不会落在集合的开头和结尾。我把它留给你作为练习。