1 /*Problem Description
2 当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。
3 现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。
4 如果其中有多个关键数的话按照其输入顺序的逆序输出。
5 Input
6 输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中:
7 1<=n<=500
8 1<a[i]<=1000
9 Output
10 请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
11 Sample Input
12 3
13 3 8 4
14 5
15 3 8 4 7 15
16 5
17 3 8 4 15 7
18 0
19
20 Sample Output
21 3
22 15 7 3
23 7 15 3 */
24 #include<stdio.h>
25 int main()
26 {
27 int n , s[501] , i , m ,c[501] ,t;
28 while(scanf("%d",&n) != EOF && n)
29 {
30 for(i=0;i<n;i++)
31 {
32 scanf("%d",&s[i]);
33 }
34 for(i=0;i<n;i++)
35 {
36 t=s[i];
37 if(t==0)continue;
38 while(t != 1)
39 {
40 if(t % 2 == 0)
41 t /= 2;
42 else
43 {
44 t = 3 * t + 1 ;
45 t /= 2;
46 }
47 for(m=0;m<n;m++)
48 {
49 if(t==s[m])
50 s[m]=0;
51 }
52 }
53 }
54 m=0;
55 for(i=n-1;i>=0;i--)
56 {
57 if(! s[i])
58 continue;
59 else
60 {
61 c[m]=s[i];
62 m+=1;
63 }
64 }
65 for(i=0;i<m-1;i++)
66 {printf("%d ",c[i]);}
67 printf("%d\n",c[m-1]);
68 }
69 return 0;
70 }