/****************************************************** 题目: 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答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
|