题目描述
当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中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
示例1
输入
3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0
输出
3 15 7 3 7 15 3
解析:
XXX定律是:对于一个数n,如果是偶数,就把n砍掉一半;如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。
代码如下:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
int n,k,i,j,b[502],a[1005],x;
while(scanf("%d",&n)!=EOF){
if(n<=0)
break;
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
scanf("%d",&b[i]);
x=b[i];
if(a[x]==0){
while(x!=1){
if(x%2==1)
x=(3*x+1)/2;
else x/=2;
if(x<=1000)
a[x]=1;
}
}
}
j=0;
for(i=n-1;i>=0;i--){
if(a[b[i]]==0)
if(j==0){
printf("%d",b[i]);
j=1;
}else
printf(" %d",b[i]);
}
printf("\n");
}
return 0;
}