2013-11-06 实验之趣味110算式(递归求解思维)

来源:互联网 发布:淘宝游戏点卡货源 编辑:程序博客网 时间:2024/06/05 15:33

题目:

    匪警请拨110,即使手机欠费也可拨通!
    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
    某批警察叔叔正在进行智力训练:
    1 2 3 4 5 6 7 8 9 = 110;
    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
    每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......



思想:先将这9个数分组,分组组成连续的数,如123,45, 678,9为其中的一个。分组的思想为9的递归拆分。最后110也是递归拆分,分+和-两种。


程序实现:

#include<stdio.h>#include<stdlib.h>int seeds[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 };int saveNum[9];int save_temp_nums[9];char saveOperate[9];int produce_nums(int p, int count){int temp = 0;int i;int x = 1;for(i = count - 1; i >= p; i--){temp += seeds[i] * x;x *= 10;}return temp;}void generate_final_alg(int temp, int num, int i){if(i == num){if(temp == 0){int j;for(j = 0; j  < num; j++){if(j  > 0){printf("%c", saveOperate[j]);}printf("%d", save_temp_nums[j]);}printf("=110\n");return;}else{return;}}saveOperate[i] = '+';generate_final_alg(temp - save_temp_nums[i], num, i + 1);saveOperate[i] = '-';generate_final_alg(temp + save_temp_nums[i], num, i + 1);}void produce_efficent_Nums(int num){int i;int temp;int p = 0;int count = 0;for(i = 0; i  < num; i++){save_temp_nums[i] = produce_nums(p,  saveNum[i] + count);p += saveNum[i];count += saveNum[i];}generate_final_alg(110 - save_temp_nums[0], num, 1);}void fun(int temp, int num){if(temp == 0){//int j;//for(j = 0; j  <num; j++){//printf("%d ", saveNum[j]);//}//printf("\n");produce_efficent_Nums(num);}int i;for(i = 1; i  <= temp; i++){saveNum[num] = i;fun(temp - i, num + 1);}}void divide_array(int seeds[]){//printf("%d\n", sizeof(seeds)); 4fun(9, 0);}int main(void){//printf("%d\n", sizeof(seeds)); 36divide_array(seeds);return 0;}