当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。
1<=n<=500
1<a[i]<=1000
3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0
3 15 7 3 7 15 3
#include<bits/stdc++.h>//万能头文件
int n, tmp, num;
int a[510];
int vis[1010];
int main()
{
while(~scanf("%d", &n) && n)
{
for(int i = 1; i <= 1000; i++)//标记覆盖数
vis[i] = 1;
for(int i = 1; i <= n; i++)
{
scanf("%d", &tmp);
a[i] = tmp;
while(tmp != 1)
{
if(tmp % 2 == 1)//奇数
tmp = (3 * tmp + 1) / 2;
else //偶数
tmp = tmp / 2;
if(tmp <= 1000)//标记覆盖数
vis[tmp] = 0;
}
}
num = 0;
for(int i = 1; i <= n; i++)
if(vis[a[i]] == 1)//没有被标记
a[++num] = a[i];
for(int i = num; i > 1; i--)//倒序输出
printf("%d ", a[i]);
printf("%d\n",a[1]);
}
return 0;
}