一个朋友发给我的,准备六张卡片,分别记为A,B,C,D,E,上面写着1~31之间的一些整数。请一位观众想好此范围内的一个数字(例如某个人的年龄),然后请他把所有上面有此数字的卡片都交给你。你随即说出他心中所想的那个数字。
卡片如下:
A:1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
B:2 3 6 7
10 11 14 15
18 19 22 23
26 27 30 31
C:4 5 6 7
12 13 14 15
20 21 22 23
28 29 30 31
D:8 9 10 11
12 13 14 15
24 25 26 27
28 29 30 31
E:16 17 18 19
20 21 22 23
24 25 26 27
28 29 30 31
秘诀就是把每张卡片上2的幂的第一个数字相加。例如,如果把卡片C和E交给你,你只要将上面第一个数字4和16相加,便知道别人心中所想的数字是20。
这是为什么呢?
我们观察卡片上的数字,可以发现这样一个规律:第一张卡片(A)上的数字如果用五位二进制表示,则分别为00001,00011,00101,00111,01001,01011,01101,01111,10001,10011,10101,10111,11001,11011,11101,11111。
第二张卡片(B)上的数字如果用五位二进制表示,则分别为00010,00011,00110,00111,01010,01011,01110,01111,10010,10011,10110,10111,11010,11011,11110,11111。
第三张卡片(C)上的数字如果用五位二进制表示,则分别为00100,00101,00110,00111,01100,01101,01110,01111,10100,10101,10110,10111,11100,11101,11110,11111。
那卡片组合就是“有无有无无”,对应二进制数为“10100”,即十进制数“20”。
结合上述例子编一简单程序:
#include <stdio.h>
int main()
{
//printf("Hello World!\n");
//return 0;
char a[6] = {0};
int sum = 0;
int i;
while(1){
printf("-------------------------start----------------------------------\n");
printf("请输入你要的数字所在的卡号,从0,1,2,3,4,5选择\n");
printf("如果该卡有这个数字请输入1,没有输入0,例如按照101010这样格式输入\n");
scanf("%c%c%c%c%c%c",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
printf("a0:%c a1:%c a2:%c a3:%c a4:%c a5:%c\n",a[0],a[1],a[2],a[3],a[4],a[5]);
for( i = 0 ; i < 6 ; i++)
{
if(a[i] == 1)
{
printf("a[%d]:%c\n",i,a[i]);
sum += (2<<i);
}
}
printf("这个数是:%d\n", sum);
sum = 0;
//for(i = 0 ; i < 6 ; i++)
//{
// a[i] = 0;
//}
printf("--------------------------end----------------------------------\n");
printf("\n");
}
return 0;
}