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

......

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

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

注意:

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

解题思路:a数组保存原始数据,op数组取-1,0,1 分别表示-,空,+ 对1-9九个数,和三种符号进行遍历。

#include <stdio.h>
int a[10]={0,1,2,3,4,5,6,7,8,9};
int op[10];//操作
int b[10];
void print(int sum)
{
printf("%d",b[1]);
int i,j;
for(i=2,j=1;i<sum+1;i++)
{
while(op[j]==0)
j++;
if(op[j]==1)
printf("+");
else
printf("-");
j++;
printf("%d",b[i]);
}
printf("\n");
}
void judge()
{
int sum=1;//此变量比较重要,用于统计b数组元素的个数。这个要理解。
int i,j=1,now=0;
b[1]=a[1];
for(i=1;i<9;i++)
{
if(op[i]==0)
b[sum]=b[sum]*10+a[i+1];
else
{
sum++;
b[sum]=a[i+1];
}
}
now=b[1];
for(i=2,j=1;i<sum+1;i++)
{
while(op[j]==0)
j++;
if(op[j]==1)
now+=b[i];
else
now-=b[i];
j++;
}
if(now==110)
print(sum);

}
void dfs(int k)
{
if(k==9)
{
judge();
return;
}
int i;
for(i=-1;i<2;i++)
{
op[k]=i;
dfs(k+1);
}
}
int main()
{
dfs(1);
return 0;
}

蓝桥杯——110_i++