显然矩阵中最大的那个数就是要求的数组中最大的那个数,所以首先把这个最大的数放到数组里去。
这里用 set 来存放矩阵中的数,因为 set 有插入数据时自动排序的功能,而且我们每次要取的数都是 set 中最大的数,所以用这种数据结构很方便。
取完第一个数后,要把这个数从 set 中删除,接下来的就是一个循环取最大数的过程了。
循环过程:
每取完一个最大数,先把这个数从set 中删除,然后删除所有已经取出来的数(也就是已经放到要求的数组中的数)和这个数的公因子,记住这里每个公因子要删两次,因为矩阵中本来就有重复的,比如 4 和 6 的最大公因子为2,矩阵中有 4 和 6 的公因子,也有 6 和 4 的公因子,而这两个值是一样的,由于set 自动排序,所以这两个相同的数肯定是挨着的,所以删的时候,连删两个就行。
代码如下;
#include <iostream>
#include <set>
using namespace std;
multiset<int> st;
int re[500];
int gcd(int m,int n)
{
int r=m%n;
while(r!=0)
{
m = n;
n = r;
r=m%n;
}
return n;
}
int main()
{
int n,nn,i,x,k=0;
cin>>n;
nn=n*n;
for(i=0;i<nn;++i)
{
scanf("%d",&x);
st.insert(x);
}
set<int>::reverse_iterator rit=st.rbegin();// 取最大的数
re[k++]=*(rit++);
st.erase(rit.base()); // 删除这个最大数
set<int>::iterator beg;
while(k<n)
{
rit=st.rbegin(); //循环取最大数
re[k]=*(rit++);
st.erase(rit.base()); // 删除这个最大数
for(i=0;i<k;++i) // 对所有之前已经取完的数
{
x = gcd(re[i],re[k]); // 删除它们的最大公因子
beg=st.lower_bound(x);
beg=st.erase(beg); //删两次
st.erase(beg);
}
++k;
}
for(i=0;i<n;++i)
printf("%d ",re[i]);
return 0;
}