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 }

 

posted @ 2013-08-11 09:27  hjf007  阅读(272)  评论(0编辑  收藏  举报