【问题标题】:Find largest and smallest numbers in an array查找数组中的最大和最小数字
【发布时间】:2017-11-25 00:45:37
【问题描述】:

我正在开发 C++ 程序以将随机值存储在大小为 1000 的数组中。 然后程序将要求用户输入“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;
        }
}

【问题讨论】:

  • 问题是什么?
  • @PaulMcKenzie 我的问题在上面,如下所述是我用来查找值的代码,但它每次都给出相同的值,例如,如果我想要 3 个最大的数字,它会给我相同的值。 99, 99 ,99
  • @1337 -- 你没有在你的主题中说明你的程序有什么问题。再次阅读您的请求——您看到问题了吗?但是有一些问题要问你——你能对数字进行排序吗?如果是这样,那么解决方案比您现在尝试的要容易得多。
  • @1337 -- 请打印数组中的数字。您会看到有重复项,因此您可能会得到 99、99、99...,因为您的数组中有 3 个或更多 99。因此,如果不重新考虑如何删除重复项,您的方法就无法奏效。最好将数字存储在 std::set&lt;int&gt; 中,然后获取最大/最小值。一个简单的 4 行解决方案。

标签: c++ arrays random


【解决方案1】:

您的错误可能是因为您没有在每次迭代后重置最大值。很难说,因为你什么都没问。

试试这个:

    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++;
    }
}

【讨论】:

  • 'size[i] = rand() % 100;'只会为您提供 0 到 99 之间的值。请参见此处:cplusplus.com/reference/cstdlib/rand
  • 每个最大值都给我相同的值。
  • 老实说,您应该只使用像 std::List 这样具有内置排序功能的容器。您可以调用 List.sort() 并将第一个 x 和 y 元素从列表中拉出,无需嵌套循环。
  • 您可能缺少 if 语句中的附加子句 ' ||最大值 == -1'
  • 你是对的......你可以用 size[x] 创建一个 int 数组,并用它来存储每个下一个最大值,检查它是否还没有存储在那个 int 数组中。
【解决方案2】:

这是使用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 函数自动“循环”并用随机值填充数组。

std::set&lt;int&gt; 构造函数只是使用数组中的值创建一个std::set。请注意,这将自动排序并删除重复条目。

一旦有了这个,只需打印出std::set 中的第一个x 数字和最后一个y 数字。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2020-01-12
    • 2014-03-05
    • 2020-07-12
    • 2021-09-15
    相关资源
    最近更新 更多