我们定义一个正整数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; }