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

题目


有3名同学做10道判断题,三人的答案如下表

成员12345678910
AFTTTFTFFTF
BFFTTTFTTFF
CTFTFTTTFTT


阅卷结果显示,三名同学每人都答对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;
}

反思与补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值