题目要求
用火柴棒摆出的0-9的数字:
如下规则:
1.移动一根火柴棒可以变为另一个数字
2.增加一根火柴棒可以变为另一个数字
3.减少一根火柴棒可以变为另一个数字给出一个10以内的简单的四则运算表达式如:
9-6=2
1.如果该表达式成立,直接输出“等式成立”
2.变换左操作数是否能使等式成立,输出变化后的等式
3.变换右操作数是否能使等式成立,输出变化后的等式
4.变换左右操作数是否能使等式成立,输出变化后的等式
“等式无法成立”
用C++语言实现!
代码实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 增加 去掉 移动
//0 8 * 6 9
//1 7 * *
//2 * * 3
//3 9 * 2 5
//4 * * *
//5 6 9 * 3
//6 8 5 9 0
//7 * 1 *
//8 * 9 6 0 *
//9 8 5 3 6 0
//使用一个关系表达式存储数字关系直接的联系
class Number
{
private:
int num;
static int num_map[10][10];//存放数字
public:
Number(int tmp=0):num(tmp)
{
}
vector<int> relationship()
{
vector<int> res;
for (int i = 0; num_map[num][i] != -1; i++)
res.push_back(num_map[num][i]);
return res;
}
};
int Number::num_map[10][10] = {
{0,6,8,9,-1},
{1,7,-1},
{2,3,-1},
{3,2,5,9,-1},
{4,-1},
{5,3,6,9,-1},
{6,0,5,8,9,-1},
{7,1,-1},
{8,0,6,9,-1},
{9,3,5,6,8,-1}
};
class match
{
public:
match()
{
}
void solution()
{
//找到分解成三个数字Number1+Number2=Number 3
Number Number1 = Number(left);
Number Number2 = Number(right);
vector<int> vec_left = Number1.relationship();
vector<int> vec_right = Number2.relationship();
//1首先检查本来的等式是否成立
if (isequal(left, right))
{
FunReult = "等式成立";
return;
}
//2改变Number1的每一项数字可以变化组成新的等式看是否成立
vector<int>::iterator it = vec_left.begin();
for (; it != vec_left.end(); ++it)
{
if (isequal(*it, right))
{
FunReult = success(*it, right);
return;
}
}
//3改变Number2的每一项数字可以变化的组成新的等式看是否成立
it = vec_right.begin();
for (; it != vec_right.end(); ++it)
{
if (isequal(left,*it))
{
FunReult = success(right, *it);
return;
}
}
//4.所有的情况遍历完毕还没有找到结果返回找不到合适的变化保证等式的成立
return;
}
string success(int elem1, int elem2)
{
char buffer[128] = { 0 };
sprintf(buffer, "%d%c%d=%d", elem1, sign, elem2, result);
return string(buffer);
}
bool isequal(int p_left, int p_right)
{
switch (sign)
{
case '+':
return p_left + p_right == result;
case '-':
return p_left - p_right == result;
case '*':
return p_left * p_right == result;
case '/':
return p_left / p_right == result;
default:
break;
}
return false;
}
private:
string expression;
int left;
char sign;
int right;
int result;
string FunReult;//最终计算的结果
friend bool operator==(const match &obj, string tmp);
friend ostream & operator<<(ostream &out, const match &obj);
friend istream & operator>>(istream &in, match &obj);
};
bool operator==(const match &obj, string tmp)
{
return obj.expression == tmp;
}
ostream & operator<<(ostream &out, const match &obj)
{
if (obj.FunReult.size() == 0)
out << "等式无法成立";
else
out << obj.FunReult;
return out;
}
istream & operator>>(istream &in, match &obj)
{
in >> obj.expression;
char dh;
sscanf(obj.expression.c_str(), "%d%c%d%c%d", &obj.left, &obj.sign, &obj.right, &dh, &obj.result);
return in;
}
int main()
{
while (1)
{
match ma;
cout << "请输入等式" << endl;
cin >> ma;
if (ma == "exit")
{
exit(0);
}
ma.solution();
cout << ma << endl;
}
return 0;
}