3

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

  1. 包含 c==2 检查
  2. 包含 a[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();
}
4

3 回答 3

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;
}
于 2013-09-26T10:46:50.510 回答
1

我相信您是从编程开始的,还没有阅读过复杂性和函数调用的内容,因此请以初学者可以理解的简单方式进行介绍。

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

int foundPrime = 0; // 如果您觉得方便,请在此处使用布尔值

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

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

至:

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."
}
于 2013-09-26T10:45:29.200 回答
0

这是一个工作示例,它定义了一个is_prime谓词,然后使用boost::filter_iteratorand在一次遍历数据的过程std::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());
}

活生生的例子

于 2013-09-26T11:50:00.783 回答