C ++如何在不使用排序的情况下从大小为n的数组中打印最小的数字

时间:2013-09-26 10:13:39

标签: c++ arrays algorithm sorting primes

我要WAP打印最小的&没有排序的给定大小数组的最大素数。我已经编写了最大数字的代码,但是对于最小的数字,它没有运行,因为我将质数的值与初始化为0的min进行比较,但是如果我在两部分中打破了If_else

  1. 包含c == 2检查
  2. 包含[i]

然后它运行因为然后在c == 2中,min已经从数组中提供了一个值,但是如果我一起运行它们就不会 所以在这里任何工作,以获得最小的数字而不打破if_else。 代码遵循

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <ctype.h>

void main ()
{
  int i,j,m;
  clrscr();
  int a[20],x,min=0,c=0;
  cout<<"Enter size of array "<<endl;
  cin>>m;
  cout<<"Enter "<<m<<" Numbers "<<endl;
  for(i=0;i<m;i++)
  {
    cin>>a[i];
  }
  for(i=0;i<m;i++)
  {
    for(j=1;j<=a[i];j++)
    {
      if(a[i]%j==0)
      {
        c++;
      }
    }
    if(c==2 && a[i]<min)//problem is here 
    {
      min=a[i];
    }
    c=0;
  }
  cout<<endl<<"the min prime no out of array is " <<min;
  getch();
}

3 个答案:

答案 0 :(得分:8)

解决你的问题:

  • 过滤素数
  • 然后find_min_max

对于min_max,您可以使用以下内容:

void find_min_max(const std::vector<int>& primes, int& minValue, int& maxValue)
{
    assert(!primes.empty());

    auto result = std::minmax_element(primes.begin(), primes.end());
    minValue = *result.first;
    maxValue = *result.second;
}

答案 1 :(得分:1)

我相信你是从编程开始的,并没有阅读复杂性和函数调用,所以把它放在初学者可以理解的简单方法中。

取一个变量来检查素数是否存在

int foundPrime = 0; //如果你感觉舒服,可以在这里使用布尔值

由于您要同时找到最大值和最小值,请更改此部分:

if(c==2 && a[i]>max)//problem is here 
{
    max=a[i];
}

TO:

if (c == 2)
{
    if (foundPrime == 0)
    {
        foundPrime = 1;
        max = a[i];
        min = a[i];
    }
    else
    {
        if (a[i] < min)
            min = a[i];

        if (a[i] > max)
            max = a[i];
    }
}

并更改最终的打印声明:

cout<<endl<<"the min prime no out of array is " <<min;

类似于:

if (foundPrime == 1)
{
cout<<endl<<"the min prime no out of array is " <<min;
cout<<endl<<"the max prime no out of array is " <<max;
}
else
{
cout<<endl<<"No prime numbers found in the array."
}

答案 2 :(得分:0)

这是一个定义is_prime谓词的工作示例,然后使用boost::filter_iteratorstd::minmax_element一次传递中获取未排序范围中的最小和最大素数数据

#include <iostream>
#include <algorithm>
#include <boost/iterator/filter_iterator.hpp>

struct is_prime
{
    bool operator()(int n) const
    {
        int small_primes[] = { 2, 3, 5, 7, 11, 13, 17, 19 };
        return std::all_of(std::begin(small_primes), std::end(small_primes), [=](int const& p) {
            return n == p || n % p != 0;
        });
    }    
};

int main() 
{
    int numbers[] = { 24, 12, 7, 8, 11, 95, 47 };
    auto pb = boost::make_filter_iterator(is_prime{}, std::begin(numbers), std::end(numbers));
    auto pe = boost::make_filter_iterator(is_prime{}, std::end(numbers), std::end(numbers));

    auto result = std::minmax_element(pb, pe);
    if (result != std::make_pair(pb, pb))
        std::cout << *(result.first.base()) << " " << *(result.second.base());
}

Live example