我要WAP打印最小的&没有排序的给定大小数组的最大素数。我已经编写了最大数字的代码,但是对于最小的数字,它没有运行,因为我将质数的值与初始化为0的min进行比较,但是如果我在两部分中打破了If_else
然后它运行因为然后在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();
}
答案 0 :(得分:8)
解决你的问题:
对于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_iterator
和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());
}