继续xxx定律

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1294    Accepted Submission(s): 361


 

Problem Description
当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。
 


 

Input
输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中:
1<=n<=500
1<a[i]<=1000
 


 

Output
请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
 


 

Sample Input
 
   
3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0
 


 

Sample Output
 
   
3 15 7 3 7 15 3
 


 

Source
 


 

Recommend
notonlysuccess

#include<stdio.h>//通过其中的几个关键数,可以表示这里所有的数值;
int notfind(int e,int *c,int j)
{
 int i;
 for(i=0;i<j;i++)
  if(c[i]==e)
   return 0;
  return 1;
}
int main()
{
    int a[550];
    int c[50000],j,flag;
 int t,i,n;
 while(scanf("%d",&t)!=EOF&&t)
 {
     j=0;flag=1;
  for(i=0;i<t;i++)
   scanf("%d",&a[i]);
  for(i=0;i<t;i++)
  {
   n=a[i];
   while(n!=1)
   {
    if(n&1)
    {
     n=3*n+1;
     n>>=1;
     c[j++]=n;
    }
    else
    {
     n>>=1;
     c[j++]=n;
    }
   }
   
  }
//  for(i=0;i<j;i++)
//  printf("%d ",c[i]);
//  printf("\n");
  for(i=t-1;i>=0;i--)
   if(notfind(a[i],c,j))
   {
        if(flag>0)//最后一个字符后没空格
        {printf("%d",a[i]);
        flag--;
        continue;
        }
   printf(" %d",a[i]);}
   printf("\n");
 }
 return 0;
}