-
-
一个很老帖:训练思维的题目
-
发表于:
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直播授课