ACM继续XXX定律

题目描述:
    当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。
输入:
    输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中: 1<=n<=500, 1<a[i]<=1000
输出:
    请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
样例输入:
3
3 8 4
5
3 8 4 7 15
5
3 8 4 15 7
0
样例输出:
3
15 7 3
7 15 3
main.cpp
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 void get_xxx(int x, int xxx[]);
 6 
 7 int main()
 8 {
 9     int xxx[400005], a[505];
10     int n,i,check;
11     while(cin>>n && n>0) {
12         for(i=0; i<n; i++) cin>>a[i];
13         memset(xxx, 0, sizeof(xxx));
14         for(i=0; i<n; i++)
15             get_xxx(a[i],xxx);
16         check=1;
17         for(i=n-1; i>=0; i--)
18             if(xxx[a[i]] == 0) {
19                 if(check==1) cout<<a[i];
20                 else cout<<" "<<a[i];
21                 check=0;
22             }
23         cout<<endl;
24     }
25     return 0;
26 }
27 
28 void get_xxx(int x, int xxx[]) {
29     if(x==1) return ;
30     if(x%2==1) 
31         x = (3*x+1)/2 ;
32     else 
33         x/=2;
34     xxx[x]=1;
35     get_xxx(x, xxx);    
36 }
原文地址:https://www.cnblogs.com/wizzhangquan/p/2954545.html