题目
有3名同学做10道判断题,三人的答案如下表
成员 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
A | F | T | T | T | F | T | F | F | T | F |
B | F | F | T | T | T | F | T | T | F | F |
C | T | F | T | F | T | T | T | F | T | T |
阅卷结果显示,三名同学每人都答对7道题。但在几天之后,题目的正确答案丢失了,现在请你求出这10道判断题的正确答案。(题目保证结果唯一)
分析
因为每人都得到7分,也就是三人的答案中,每人分别与正确答案有7个匹配的,另外有3个不匹配,而与三人的答案之间没有关系,可能某个题三人答案一致,但全都与正确答案不同。我们需要构造一个数据作为答案,分别与三个数作比较。
作为判断题,只有T和F两个答案,用C语言中的位操作来代表答案的状况是非常合适的。
概要设计
本程序可以没有输入,因为三名同学的答案是已知条件,可以设计在程序中当作常量直接用去计算正确答案。共有10个题的判断题,所有答案组合有
210=1024
种可能,可以让一个变量遍历这1024个答案组合,每个答案组合分别与A,B,C三人的答案去匹配,由于题目已经说了确保答案唯一,所以某答案组合与三名同学的答案匹配个数均为7时,可以结束遍历,再将这个数转换成T,F的形式来表达即可。
那么除了主函数main()之外,应当设计一个检查匹配的函数int match(unsigned int a,unsigned int b),用以比较a与b有多少比特位是一致的,返回值是一致的位数。
int match(unsigned int a,unsigned int b)
{
int counter=0,i;
for(i=0;i<10;i++,a>>=1,b>>=1){//每循环一次就令a与b均向右移一位
if((a&1)==(b&1))//比较当前的最低位
counter+=1;
}
return counter;
}
主函数里就可以设计一个变量current_answer,令它遍历所有可能的答案,同时与三名同学的答案比较,当三个匹配结果都是7时,跳出循环
程序设计
#include <stdio.h>
#include <stdlib.h>
int match(unsigned int a,unsigned int b)
{
int i,counter=0;
for(i=0;i<10;i++,a>>=1,b>>=1){
if((a&1)==(b&1))
counter+=1;
}
return counter;
}
int main(void){
//把三人的答案直接以十六进制保存
int const A_ans=0x01D2,
B_ans=0x00EC,
C_ans=0x02BB;
unsigned current_answer;
int k;
for(current_answer=0;current_answer<0x400;current_answer++)//从0x0000到0x0400-1包含所有1024个结果
if(match(current_answer,A_ans)==7 &&
match(current_answer,B_ans)==7 &&
match(current_answer,C_ans)==7 )
break;
for(k=0;k<10;k++){ //得到结果,以T,F的形式输出
if(current_answer&0x0400==1)//只检查第1位的0/1值
printf("T");
else
printf("F");
current_answer<<=1;//左移1位,将下一位移到第1位上
}
printf("\n");
return 0;
}
反思与补充
无