问题描述

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

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 两种情况, 输出的时候也就成了进制转换问题;

代码实现

#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 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