学校进行了一次英语考试,共有10道是非题,每题为10分,解答用1表示"是",用0表示"非"的方式。但老师批完卷后,发现漏批了一张试卷,而且标准答案也丢失了,手头只剩下了3张标有分数的试卷。
试卷一:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 0 1 0 1 0 0 1 0 0 得分:70
试卷二:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 1 1 1 0 1 0 1 1 1 得分:50
试卷三:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 1 1 1 0 0 0 1 0 1 得分:30
待批试卷:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 0 1 1 1 0 0 1 1 1 得分:?
请编一程序依据这三张试卷,算出漏批的那张试卷的分数。
用穷举吧,反正才10个题...
#include <cstdio>
int bits(int a) // 计算a中有多少个位是1
{
int c = 0;
for(c = 0; a; c++)
{
a = a & (a-1);
}
return c;
}
int main()
{
int i;
int a[4] = {0x0a4, 0x1d7, 0x1c5, 0x0e7,};
int s[4] = {7, 5, 3, 0};
for(i = 0; i < 1024; i++) // 尝试各种答案
{
if (10 - bits(a[0] ^ i) == s[0] && // a[0] ^ i 表示按照答案i对a[0]批改,得到1的位为不同的(也就是答错的)题
10 - bits(a[1] ^ i) == s[1] &&
10 - bits(a[2] ^ i) == s[2]) // 得分都满足的答案可能是正确答案
{
s[3] = 10 - bits(a[3] ^ i); // 计算漏批卷子的分数
printf("%d\n", s[3]);
}
}
return 0;
}
int bits(int a) // 计算a中有多少个位是1
{
int c = 0;
for(c = 0; a; c++)
{
a = a & (a-1);
}
return c;
}
int main()
{
int i;
int a[4] = {0x0a4, 0x1d7, 0x1c5, 0x0e7,};
int s[4] = {7, 5, 3, 0};
for(i = 0; i < 1024; i++) // 尝试各种答案
{
if (10 - bits(a[0] ^ i) == s[0] && // a[0] ^ i 表示按照答案i对a[0]批改,得到1的位为不同的(也就是答错的)题
10 - bits(a[1] ^ i) == s[1] &&
10 - bits(a[2] ^ i) == s[2]) // 得分都满足的答案可能是正确答案
{
s[3] = 10 - bits(a[3] ^ i); // 计算漏批卷子的分数
printf("%d\n", s[3]);
}
}
return 0;
}
结果很巧,虽然有多种可能的正确答案,但这张卷子都是60分- -