低碳生活答题问题

问题描述

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
​ 1、每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
​ 2、每位选手都有一个起步的分数为10分。 某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
​ 3、如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
​ 4、你的任务是算出所有可能情况。每个答案占一行。

解题思路

一共十个问题,每个问题两种情况,要么对要么错,那么结果就会有 0000000000 ~ 1111111111 = pow(2,10)种,就可以用暴力搜索将所有情况枚举出来然后判断符合要求的情况;
​ 分数的控制可以直接利用遍历所有情况的 for 循环分别判断两种情况;
​ 如果用输出 1 代表回答正确, 0 代表错误,不难想到任何一个正整数对 2 取余结果只有 1 和 0 两种情况, 输出的时候也就成了进制转换问题;

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h> 
#include <math.h>
int main() {
int i,j;
int score,temp;

for(i=0;i<pow(2,10);i++){
temp=i;
score=10;

for(j=0;j<10;j++){
if(temp%2 == 1)
score*=2;
else
score-=j+1;
temp/=2;
}

if(score==100){
temp=i;
for(j=0;j<10;j++){
printf("%d ", temp%2);
temp/=2;
}
printf("\n");
}
}
return 0;
}

运行结果

1
2
3
1 0 1 1 0 1 0 0 0 0 
0 1 1 1 0 1 0 0 0 0
0 0 1 0 1 1 0 0 1 1
-------------本文结束感谢您的阅读-------------
请站长喝杯咖啡吧´◡`