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