Problem 1061 - ACM码
/*
Time Limit: 1000MS Memory Limit: 65536KB Difficulty:
Total Submit:
153 Accepted: 81 Special Judge:
No
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)就行了。
1 #include<stdio.h> 2 int gray(int n) 3 { 4 return n^(n>>1); 5 } 6 int main() 7 { 8 int T,n; 9 scanf("%d",&T); 10 while(T--) 11 { 12 scanf("%d",&n); 13 printf("%d\n",gray(n)); 14 } 15 return 0; 16 }