#include <stdio.h>
int find_min(int [][101], int, int);
int find_max(int [][101], int, int);
int analyse (int [][101], int, int);
int main (void) {
int key[2][101];
int n,m,s;
int j;
int index,p_index;
int account;
scanf ("%d", &n);
if (n>=100) return 1;
m=n;
//初始化二维数组
if (n>=100) {
return 1;
} else {
for (j=0;j<n;j++) {
scanf("%d", &s);
if (s<=1 || s>100) return 1;
key[0][j]=s;
key[1][j]=0;
}
}
//找到最小的数,从最小的数开始分析。
while (m>0){
index=find_min(key, n, 0); //从Label0 找出最小的数的下标
account=analyse(key, index, n); //分析,并标注Labele为2, 如果该数被覆盖,更改Lable1
m=m-account; // 整个数组除去 Label 1 2, 这两种情况。
}
//统计一下,数组中Label 2的数总共有多少个
account=0;
for (j=0;j<n;j++){
if (key[1][j]==2) account++;
}
//在这些Label为2的数中找出最大的那个打印。
while(account>0) {
p_index=find_max(key, n, 2);
printf ("%d",key[0][p_index]);
account--;
if (account>0) printf (" ");
}
return 0;
}
int find_min(int key[][101], int n, int label) {
int m_min,m_index=0;
int i;
for (i=0; key[1][i]!=label && i<n ; ) {
i++;
}
m_min=key[0][i];
m_index=i;
for (i=0;i<n;i++) {
if (m_min > key[0][i] && key[1][i]==label ) {
m_min=key[0][i];
m_index=i;
}
}
return m_index;
}
int find_max ( int key[][101], int n, int label) {
int m_max,x_index=0;
int i;
for (i=0; key[1][i]!=label && i<n ; ) {
i++;
}
m_max=key[0][i];
x_index=i;
for (i=0;i<n;i++) {
if (m_max < key[0][i] && key[1][i]==label ) {
m_max=key[0][i];
x_index=i;
}
}
key[1][x_index]=1;
return x_index;
}
int analyse (int key[][101], int a_index, int n) {
int i,account=0;
int mykey;
mykey=key[0][a_index];
if ( mykey==1 ) key[1][a_index]=1;
key[1][a_index]=2;
account++;
while (mykey!=1) {
if (mykey%2) {
mykey=(3*mykey+1)/2;
} else {
mykey = mykey/2;
}
for (i=0;i<n;i++) {
if ( mykey==key[0][i] && key[1][i]!=1 ) {
if (key[1][i]==0) account++;
key[1][i]=1;
}
}
}
return account;
}
PAT1005
最新推荐文章于 2022-09-07 21:58:41 发布