[.cpp]位运算程序设计_找出判断题答案

来源:互联网 发布:淘宝怎么搜好看的衣服 编辑:程序博客网 时间:2024/06/05 20:13

题目


有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;}

反思与补充