趣味算式

匪警请拨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
......

已知的两个答案可以输出,但不计分。

各个答案的前后顺序不重要。

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int a[8];
 5 int fun()
 6 {
 7     int i,j,t,sum,k;
 8     sum=0;
 9     k=1;
10     j=0;
11     for(i=0,t=1;i<8;i++)
12     {
13         if(a[i]==0)
14             t=t*10+(i+2);
15         else if(a[i]==1)
16         {
17             if(k==1) sum+=t;
18             else
19                 sum-=t;
20             t=i+2;
21             k=1;
22         }
23         else
24         {
25             if(k==1) sum+=t;
26             else
27                 sum-=t;
28             t=i+2;
29             k=2;
30         }
31     }
32     if(k==1) sum+=t;
33     else    sum-=t;
34     return sum;
35 }
36 
37 
38 void dfs(int cur)
39 {
40     int i;
41     if(cur==8)
42     {
43         if(fun()==110)
44         {
45             printf("1");
46             for(i=0;i<8;i++)
47                 if(a[i]==0)  printf("%d",i+2);
48                 else if(a[i]==1) printf("+%d",i+2);
49                 else printf("-%d",i+2);
50             printf("\n");
51         }
52         return ;
53     }
54     a[cur]=0;
55     dfs(cur+1);
56     a[cur]=1;
57     dfs(cur+1);
58     a[cur]=2;
59     dfs(cur+1);
60 }
61 int main()
62 {
63     dfs(0);
64     return 0;
65 }

 

posted @ 2013-05-19 16:43  萧凡客  阅读(334)  评论(2编辑  收藏  举报