PAT Basic Level 1005

思路:设置一个数组读入数据,一次对数组中每一个数据进行操作,设置list 数组,下标作为关键字,内容作为标记,将操作过程中遇到的数字在list中置1,然后再次检索输入数据,看list对应位置是否为1,

若为1,则被覆盖否则放入输出数组,对输出数组从大到小排序后即为所求者。

AC代码

 1 #include <stdio.h>
 2 int main ()
 3 {
 4     int ret[102] = {0};
 5     int list[102] = {0};
 6     int input [102] = {0};
 7     int count = 0;
 8     scanf("%d",&count);
 9     int i = count;
10     while(i != 0)               //将数据读入到input数组中
11     {
12         scanf("%d",&input[i]);
13         i--;
14     }
15      i = count;
16      int x;
17                                               // x = input[i];      
18     while(i != 0)
19     {
20         x = input[i];
21         while(x != 1)                  //进行"猜想“,在运算过程中碰到的数字,都将list中相应位置置1
22         {
23         
24             if(x % 2 == 0)
25                 {
26                     x = x/2;
27                 }
28             else
29             {
30                 x = (3*x+1)/2;
31             }
32             if (x >= 0&&x <= 100)
33             {
34                 list[x] = 1;
35             }
36         }
37         i --;
38     }
39     i = 0;
40     while(count != 0)              //list表中置1的数字都是被覆盖的,若输入的数据在list表中不是1则是索求着
41     {
42         if(list[input[count]] != 1)
43         {
44             ret[i] = input[count];
45             i++;
46         }                        //i最后的值就是ret的长度,即答案的个数
47         count --;
48     }
49     int j;
50 
51     for(j = 0;j < i - 1;j++)      //冒泡排序,将ret数组中数据从大到小排练,其实可以使用qsort函数。此处锻炼下自己编程
52     {
53         for(x = 0;x < i-j;x++)
54         {
55             int temp;
56             if(ret[x]<ret[x+1])
57             {
58                 temp = ret[x+1];
59                 ret[x+1]=ret[x];
60                 ret[x] = temp;
61             }
62         }
63     }
64     for (j = 0;j < i;j++)
65     {
66         printf("%d",ret[j]);
67         if (j != i-1)
68         {
69             printf(" ");
70         } 
71     }
72     
73     return 0 ;
74     
75 }

 

posted @ 2016-10-18 22:55  Ponytai1  阅读(179)  评论(0编辑  收藏  举报