继续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


  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <cctype>
  7 #include <vector>
  8 #include <list>
  9 #include <deque>
 10 #include <stack>
 11 #include <queue>
 12 #include <map>
 13 #include <set>
 14 #include <string>
 15 #include <algorithm>
 16 
 17 
 18 using namespace std;
 19 
 20 
 21 int a[10000];
 22 int vis[10000];
 23 
 24 
 25 
 26 
 27 int main()
 28 {
 29 
 30 
 31     int n;
 32     int i,j,k;
 33 
 34     while(scanf("%d",&n)!=EOF)
 35     {
 36         if(n==0)
 37             break;
 38 
 39         for(i=0;i<n;i++)
 40             scanf("%d",&a[i]);
 41 
 42         for(i=0;i<n;i++)
 43             vis[i]=0;
 44 
 45 
 46         for(i=0;i<n;i++)
 47         {
 48 
 49             k=a[i];
 50 
 51             while(k!=1)
 52             {
 53                 if(k%2==0)
 54                 {k/=2;
 55 
 56                       for(j=0;j<n;j++)
 57                     {
 58                         if(a[j]==k)
 59                         vis[j]=1;
 60                     }
 61 
 62                 
 63                 
 64                 }
 65                 else
 66                 {
 67                     k=3*k+1;
 68 
 69                     k/=2;
 70 
 71                        for(j=0;j<n;j++)
 72                     {
 73                         if(a[j]==k)
 74                         vis[j]=1;
 75                     }
 76 
 77 
 78                 }
 79             }
 80         }
 81 
 82         int tag=0;
 83 
 84         for(i=n-1;i>=0;i--)
 85         {
 86             if(vis[i]==0)
 87             {
 88                 if(tag==0)
 89                 {    printf("%d",a[i]);tag=1;}
 90                 else
 91                     printf(" %d",a[i]);
 92             }
 93         }
 94 
 95         puts("");
 96     }
 97 
 98             
 99 
100 
101 
102 
103     return 0;
104 }

 

转载于:https://www.cnblogs.com/zjushuiping/archive/2012/05/30/2526858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值