zoukankan      html  css  js  c++  java
  • hdu 3784 继续xxx定律

    当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
     
    // 3n+1 问题
    // 这题目真是好难理解
    // 就是求序列中哪些数不会被覆盖

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace
     std;
    bool
     h[200000];
    int
     main()
    {

         int
     n,m,i,k,a[503],b[503];
         while
    (scanf("%d",&n),n)
         {

            memset(h,0,sizeof(h));
            for
    (i=0;i<n;i++)
               scanf("%d",&b[i]);
           for
    (i=0;i<n;i++)  ///坑人呀,或许是我想的不周全,理解不到位
          {

              m=b[i];
            while
    (m>1)
            {

                if
    (m%2)
                  m=(m*3+1)>>1;
                 else

                  m=m>>1;
                h[m]=1;
            }
          }

            for
    (k=i=0;i<n;i++)
            {

                  if
    (!h[b[i]])
                   a[k++]=b[i];
            }

            printf("%d",a[--k]);
            for
    (k--;k>=0;k--)
             printf(" %d",a[k]);
             printf("\n");
         }

            return
     0;
    }

                                                           -------江财小子

  • 相关阅读:
    C# 多态性
    C# FileStream类
    C# File文件类
    加快访问GitHub的速度
    Git-修改.gitignore后使其配置生效的方法总结
    ES6 解构赋值
    avue表单数据请求
    uniapp canvas组件复用
    uniappH5 fly.js Golang 解决跨域问题
    java bug记录
  • 原文地址:https://www.cnblogs.com/372465774y/p/2421647.html
Copyright © 2011-2022 走看看