蓝桥杯 算法 奇怪的比赛

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

你的任务是算出所有可能情况。每个答案占一行。

参考答案:
1011010000
0111010000

0010110011

这道题是我从一个博主那看来的:https://blog.csdn.net/weixin_38391092/article/details/79673968

他用的是递归,而我的想法则是不想用递归,毕竟递归需要消耗不少内存,但原理和他一样,都是暴力破解,我的想法是十道题就会有1024种可能(每道题都可以是1或是0,则数量为2的十次方等于1024),那么循环1024次,在for循环中,获取该数的二进制码所对应的最后的分结果,如果结果为100分,则输出。下面是我的代码:

#include 
#include 


int main(int argc, char *argv[]) {
	int i, j, k, a, b,goal;
 	
	a = 10;
	for(i = 0;i<1024;i++) 
	{
		a = i;
		goal = 10;
		for(j=1;j<=10;j++)
		{
			b = a&1;  //取a的最后一位 
			a = a>>1; //将a右移一位,把最后一位抛弃 
			if(b==0)  //对b进行判断,并计算对应分数 
			{
				goal = goal-j;
			}
			if(b==1)
			{
				goal = goal*2;
			}
		}
		if(goal == 100) //分数为100,则进行输出 
		{
			a = i;
			for(k = 0;k<10;k++)
			{
				b = a&1;
				a = a>>1;
				printf("%d",b);
			}
			printf("\n");
		}
		/*
		if(i%10==0)
		{
			printf("%d\n",i); //测试用 
		}
		*/
	}
	return 0;
}

你可能感兴趣的:(算法)