PAT1005

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值