匪警请拨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 …… 已知的两个答案可以输出,但不计分。
解析 用num[9]保存八个位置的运算符(将‘ ’当做一个运算),用递归进行搜索
#include<iostream>
#include<cstdlib>
using namespace std;
char num[9] ;
//进行计算
int check()
{
string str = "123456789";
int sum = 0;
int index =0,x = 0;
char c = ' ';
int i;
for(i = 1; i <= 8; i++)
{
if(num[i]!=' ')
{
if(c==' ')
{
sum += atoi(str.substr(index,i-index).c_str());
}
else if(c == '+')
{
x = atoi(str.substr(index,i-index).c_str());
sum += x;
}
else
{
x = atoi(str.substr(index,i-index).c_str());
sum -= x;
}
c = num[i];
index = i;
}
}
if(c == '+')
{
x = atoi(str.substr(index,i-index).c_str());
sum += x;
}
else
{
x = atoi(str.substr(index,i-index).c_str());
sum -= x;
}
return sum;
}
void print()
{
int index = 0;
string str = "123456789";
for(int i = 1; i < 9; i++)
{
if(num[i]!=' ')
{
cout << str.substr(index,i-index) ;
cout << num[i];
index = i;
}
}
cout << str.substr(index,9-index)<<endl;
}
void slove(int index,char cal)
{
if(index==8)
{
if(check()==110)
{
print();
}
}
if(index < 8)
{
slove(index+1,num[index+1] = ' ');
slove(index+1,num[index+1] = '+');
slove(index+1,num[index+1] = '-');
}
}
int main()
{
slove(0,' ');
}
大家觉得不错的话就关注一下我吧!