MOOC程序设计编程作业6.5

时间:2022-06-20 22:30:16

我们定义一个正整数a比正整数b优先的含义是:
*a的质因数数目(不包括自身)比b的质因数数目多;
*当两者质因数数目相等时,数值较大者优先级高。


现在给定一个容器,初始元素数目为0,之后每次往里面添加10个元素,每次添加之后,要求输出优先级最高与最低的元素,并把该两元素从容器中删除。

输入

第一行: num (添加元素次数,num <= 30)

下面10*num行,每行一个正整数n(n < 10000000).

输出

每次输入10个整数后,输出容器中优先级最高与最低的元素,两者用空格间隔。

样例输入
1
10 7 66 4 5 30 91 100 8 9
样例输出
66 5
  
#include <set>  
#include<cmath>
#include <cstdio>
using namespace std; 

bool prime(int x)
{
	for (int i = 2; i <= sqrt(x); i ++)
	{
		
		if (x % i == 0)
			return false;
	}
	return true; 
}

int getprimefactor(int a)
{
	int sum = 0;
	int k = 0;
	for (int i = 2; i <= sqrt(a); i ++)
	{
		if (a % i == 0)
		{
			k = a / i;
			if (prime(i))
			{
				sum++;
			}
			if (k != i && prime(k))
			{
				sum++;
			}
		}
	}
	return sum;
}
	

class primefactor
{
public:
	bool operator()( const int& a, const int& b)
	{
		int suma = 0;
		int sumb = 0;
		suma = getprimefactor( a );
		sumb = getprimefactor( b );
		if (suma == sumb)
		{
			if (a < b )
				return true;
			else
				return false;
		}
		else
			if (suma > sumb)
			{
				return false;
			}
		else
			return true;
	}
};

	 
  
int main()  
{   
	set < int, primefactor > op;
	int n = 0;;
	scanf("%d", &n);
	while (n--)
	{
		int m;
		for (int i = 0; i < 10; i++)  
        {  
            scanf("%d", &m);  
            op.insert(m);  
        }  
		int min = *(op.begin());
		int max = *(op.rbegin());
		op.erase(max);
		op.erase(min);
		printf("%d %d\n",max, min);
	}
	
	return 0;
}