题目1033:继续xxx定律
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:5948
解决:1459
-
题目描述:
-
当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
-
-
#include<stdio.h> int a[505]; int main(){ int n; while(1){ int tag; int i,j,k; scanf("%d",&n); if(n==0) break; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++){ int tmp=a[i]; while(a[i]!=1&&tmp!=1){ while(tmp%2==0){ tmp=tmp/2; for(j=0;j<n;j++){ if(tmp==a[j]) a[j]=1; if(a[i]==a[j]&&i!=j) a[j]=1; } }//while while(tmp%2==1&&tmp!=1){ tmp=(tmp*3+1)/2; for(j=0;j<n;j++){ if(tmp==a[j]) a[j]=1; if(a[i]==a[j]&&i!=j) a[j]=1; } }//while }//if }//for for(i=0;i<n;i++){ if(a[i]!=1){ tag=i; break; } } for(k=n-1;k>tag;k--){ if(a[k]!=1) printf("%d ",a[k]); } printf("%d\n",a[tag]); } return 0; }