首页
社区
课程
招聘
一个很老帖:训练思维的题目
发表于: 2012-5-4 21:50 6094

一个很老帖:训练思维的题目

2012-5-4 21:50
6094

无意翻看老帖,看到这题目。
源地址:
http://bbs.pediy.com/showthread.php?t=17311

作为逻辑题,二楼heXer 已经给出了答案。不过没有人给出程序实现

或许看雪的牛牛们都不屑这些问题啊 ,呵呵。

题目就不copy了,看原帖行了。

十个题目按顺序表示,每个题目“1表示“是”,用0表示“非””,所以可以用一个数字的二进制的低十位表示正确的答案,也就是说如果标准答案的第n(0 <=n<=9)题为"是" 对应的数字(左边开始)第n位的值为1,为“非”则0。则二进制数字从0000000000 到 1111111111,可以表示了所有的答案的情况了。这样就可以从二进制的 0000000000 到 1111111111之间(也就是十进制的 0 - 1023)每个数字遍历每种情况是否符合原题目的三张试卷的分数了。符合的就可能是答案,这样就可以计算最后一张试卷的分数了。枚举答案时候,答案和试卷填写的的对应位二进制位如果相同则 +10分。这样就可以求得该答案为标准时候某试卷的分数是多少。就比如当标准答案为 0 0 0 0 0 0 0 0 0 1(十进制数字为 1),有个人提交试卷为 0 0 0 0 0 0 0 1 0 1 (十进制数字为 5),那么该试卷的得分就是 90了,因为第八题错了。

将第一张试卷(0    0    1    0    1    0    0    1    0    0)用数字表示即是:164
其他的也相应转换。

破代码如下:

int GetScores(int nAnswer, int nSubmit)
{
    int nScores = 0;
// 二进制的表示,前十位的对应第n位如果相同,则第n题正确 + 10分
    for (int i = 0; i < 10; i++) {
        if ((nAnswer % 2) == (nSubmit % 2)) {
            nScores += 10;
        }

        nAnswer >>= 1;
        nSubmit >>= 1;
    }

    return nScores;
}

void PrintAnswer(int nAnswer)
{
    bool bBuff[10] = { 0 };
    int i = 0;

    for (i = 0; i < 10; i++) {
        bBuff[i] = nAnswer % 2;
        nAnswer >>= 1;
    }
    printf("( ");

    for (i = 0; i < 10; i++) {
        printf(" %d ", bBuff[9 - i]);
    }
    printf(")");
}
// 每张试卷写成的二进制数字
// 二进制数字 0 0 1 0 1 0 0 1 0 0 == 十进制 164
// 二进制数字 0 1 1 1 0 1 0 1 1 1 == 十进制 471
// 二进制数字 0 1 1 1 0 0 0 1 0 1 == 十进制 453

// 二进制数字 0 0 1 1 1 0 0 1 1 1 == 十进制 231

int _tmain(int argc, _TCHAR* argv[])
{
    int nCount = 0;
    // 从0 枚举到 1023 也就是二进制的 0000000000 - 1111111111
    for (int i = 0; i < 1024; i++) {
        //  0 0 1 0 1 0 0 1 0 0
        // 164 为第一张试卷的数字表示,
        if (GetScores(i, 164) != 70) {
            continue;
        }
        if (GetScores(i, 471) != 50) {
            continue;
        }
        if (GetScores(i, 453) != 30) {
            continue;
        }

        nCount++;

        printf("第 %d 种答案可能为:", nCount);
        PrintAnswer(i);
        printf("最后一张试卷分数:%d.\n", GetScores(i, 231));
    }

    return 0;
}

运行结果:
第 1 种答案可能为:(  0  0  0  0  1  1  0  1  1  0 )最后一张试卷分数:60.
第 2 种答案可能为:(  0  0  1  0  1  1  0  0  1  0 )最后一张试卷分数:60.
第 3 种答案可能为:(  0  0  1  0  1  1  1  1  1  0 )最后一张试卷分数:60.
第 4 种答案可能为:(  1  0  1  0  1  1  0  1  1  0 )最后一张试卷分数:60.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
楼主牛人也,收藏先。
2012-5-4 23:29
0
雪    币: 20897
活跃值: (4095)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Thank you very much
2012-5-5 06:21
0
雪    币: 2503
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看不太懂!!!
2012-5-5 09:48
0
游客
登录 | 注册 方可回帖
返回
//