XDOJ1061--ACM码

Description

  大家都很熟悉十进制,二进制,今天我们来讨论另外一种特殊的码--ACM码,大家先参照下下面的对应关系,本质上就是第 I 个 ACM 码值是在与第 I-1个 ACM 码之间只有一个 1 不同,当对应的十进制数大于 15 时大家可以依次类推出来

十进制  二进制数  ACM码

0  0000   0000

1 0001   0001

2 0010   0011

3 0011   0010

4 0100   0110

5 0101   0111

6 0110   0101

7 0111   0100

8 1000   1100

9 1001   1101

10 1010   1111

11 1011   1110

12 1100   1010

13 1101   1011

14 1110   1001

15 1111   1000

 

 

Input

第一行一个正整数 Case,代表多少组数据 (Case<=100)
第二行到第 Case+1 行每组数据一个整数 n; (n<=2000);

Output

一共 Case 行,每行一个整数代表输入对应数的 ACM 的码对应的十进制数

Sample Input

2
2
3

Sample Output

3
2

 

解题思路 

 

实际这个所谓的ACM码就是在电路中广泛应用的格雷码。法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。如果知道这个就不难了,一个条件n^(n>>1)就行了。

#include <iostream>
using namespace std;


int main()
{
    int T;
    cin>>T;
    for(int c=0;c<T;++c)
    {
        int n;
        cin>>n;
        cout<<(n^(n>>1))<<endl;
    }
    return 0;
}

 

最后欢迎大家访问我的个人网站: 1024s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值