/******************************************************
题目: 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
时间:2012-05-15 17:48
******************************************************************************/
/************************下面先用个递归的,这个题用穷举也可以做,在后面在附加个穷举的(嵌套循环虽多,但容易理解)
**************/
# if 0
# include <stdio.h>
//首先定义个全局数组(用来存放0 1串)
int a[12];
//函数声明
void print(void);
void find_select(int number, int score);
int main()
{
find_select(1,10);//为了方便,数组的下标从1开始,表示第一个题
return 0;
}
//定义函数,用来寻找答对,答错的题
void find_select(int number, int score)
{
int i;
//当题的数目大于10个说明已经答题完成
if(number>10)
{
//如果答题的分数为100就输出数组中的串
if(100 == score)
print();
}
else
{
for(i = 1; i>=0; i--)
{
a[number] = i;
//每次调用函数都会有一对if else,并却执行完if接下来就要执行else(因为1完后会变为0),因为这样在这一个函数中在if中score的改变会影响到else中的score
//所以在执行else时,要先把score还原
if(1 == i)
{
score *= 2;
find_select(number+1, score);
score /= 2; //if else无论调用多少次,都会在每次调用中存在一对,所以执行完上面一句,要把score还原,在执行接下来的else
}
else
{
score -= number;
find_select(number+1, score);
//在下面加不加 score += number;无所谓,因为执行完上面一句,函数就要返回到上一层,上一层的score与这一层的score是两个变量
}
}
}
}
//定义函数,输出数组中的串
void print(void)
{
int i;
for(i = 1; i<11; i++)
{
printf("%d", a[i]);
}
printf("\n");
}
/****************************************************
1011010000
0111010000
0010110011
Press any key to continue
***************************************************/
# endif
/************************************************
下面就是穷举法,这个方法很好用的,虽然这个的效率低,但在算法中,他的地位是不低的;就像在破解qq密码时就是用到穷举的方法
当然要是光靠穷举,那时间用的可不是个小的数目,要是在加上本“词典”,呵,那就不错啦(这里的词典可不是你用的词典哦,自己去查吧,没准你还能发现点东西呢)
至于咋破解,不会哦
*******************************************************************************************/
//下面的这点循环对现在的个人机来说应该不算什么了吧!
# if 1
# include <stdio.h>
int a[12];
//函数声明
void print(void);
int main()
{
//先申请10变量,用来for循环
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a0;
int number = 0;
int score = 10;
int sum = 0;
int i;
for(a1 = 1; a1>=0; a1--)
{
a[1] = a1;
for(a2 = 1; a2>=0; a2--)
{
a[2] = a2;
for(a3 = 1; a3>=0; a3--)
{
a[3] = a3;
for(a4 = 1; a4>=0; a4--)
{
a[4] = a4;
for(a5 = 1; a5>=0; a5--)
{
a[5] = a5;
for(a6 = 1; a6>=0; a6--)
{
a[6] = a6;
for(a7 = 1; a7>=0; a7--)
{
a[7] = a7;
for(a8 = 1; a8>=0; a8--)
{
a[8] = a8;
for(a9 = 1; a9>=0; a9--)
{
a[9] = a9;
for(a0 = 1; a0>=0; a0--)
{
a[10] = a0;
//遍历10个数组元素,根据元素状态,进行加分,或减分
for(i = 1; i<=10; i++)
{
if(a[i] == 1)
{
score *= 2;
sum += score;
}
else
{
score -= i;
sum += score;
}
}
//当分数够了100分时就输出啦
if(100 == score)
{
print();
}
//别忘了对score进行初始化,为下一次的运算做准备
score = 10;
}
}
}
}
}
}
}
}
}
}
return 0;
}
//定义函数,对串进行输出
void print(void)
{
int i;
for(i = 1; i<11; i++)
{
printf("%d", a[i]);
}
printf("\n");
}
/************************************
1011010000
0111010000
0010110011
Press any key to continue
*******************************************/
# endif
联系客服