火柴棒问题
用火柴棒摆成的0 - 9间的数字,横向由一根火柴构成,纵向都是由两根火柴构成,
可按如下规则进行变化:
1.数字移动一根火柴棒可变成其它0到9之间合法的数字
2.数字添加一根火柴棒可变成其它0到9之间合法的数字
3.数字去掉一根火柴棒可变成其它0到9之间合法的数字
现在给出一个带有两个操作数的 + , -, *, / 的算术式子,需要你判断该式子是否
成立,如给出式子9 - 6 = 3,这个符合正常结果,正确;如给出式子
9 - 6 = 2,其判断规则如下:
1.变换左操作数可以使式子成立的话,打印出来变化后的算术等式
2.变换右操作数可以使式子成立的话,打印出来变化后的算术等式
3.变化左右操作数可以使式子成立的话,打印出来变化后的算术等式
4.以上变化都无法让等式成立,打印等式无法成立
完成代码注意事项:
1.请用C++面向对象语言来完成代码书写,书写代码要依
据编程规范,代码质量和代码功能实现各占一半的分数。
2.不考虑负数的情况
class CInt
{
public:
void setvalue(int value){ mvalue=value; }
void beginChange(){ index = 0; }
bool bcanChange(){ return mNumMap[mvalue][index] != -1; }
int nextValue(){ return mNumMap[mvalue][index++]; }
operator int(){ return mvalue;}
private:
int mvalue;
static int mNumMap[10][10];
int index;
friend ostream&operator<<(ostream&out, const CInt&intObj);
};
int CInt::mNumMap[10][10] =
{
{ 6, 8, 9, -1 },
{ 7, -1 },
{ 3, -1 },
{ 2, 5, 9, -1 },
{ -1 },
{ 3, 6, 9, -1 },
{ 0, 5, 8, 9, -1 },
{ 1, -1 },
{ 0, 6, 9, -1 },
{ 0, 3, 5, 6, 8, -1 },
};
ostream&operator<<(ostream&out, const CInt&intObj)
{
out << intObj.mvalue;
return out;
}
class CMatch
{
public:
void parse(char*input)
{
char*p = input;
mleft.setvalue(*p - '0');
p++;
msign = *p;
p++;
mright.setvalue(*p-'0');
p++;
p++;
mresult.setvalue(*p-'0');
}
int makeResult(int left, char sign, int right)
{
switch (sign)
{
case'+':
return left + right;
case'-':
return left - right;
case'*':
return left * right;
case'/':
return left / right;
default:
throw"invalid sign!";
break;
}
}
void match()
{
int value = 0;
int result = 0;
result = makeResult(mleft, msign, mright);
if (mresult == result)
{
cout << "is right,no change" << endl;
cout << mleft << msign << mright << "=" << result << endl;
return;
}
mleft.beginChange();
while (mleft.bcanChange())
{
value = mleft.nextValue();
result = makeResult(value, msign, mright);
if (mresult == result)
{
cout << "change left number success!" << endl;
cout << value << msign << mright << "=" << result << endl;
return;
}
}
mright.beginChange();
while (mright.bcanChange())
{
value = mright.nextValue();
result = makeResult(mleft, msign, value);
if (mresult == result)
{
cout << "change right number success!" << endl;
cout << mleft << msign << value << "=" << result << endl;
return;
}
}
int leftval = 0;
int rightval = 0;
mleft.beginChange();
while (mleft.bcanChange())
{
leftval = mleft.nextValue();
mright.beginChange();
while (mright.bcanChange())
{
rightval = mright.nextValue();
result = makeResult(leftval, msign, rightval);
if (mresult == result)
{
cout << "change left and right number success!" << endl;
cout << leftval << msign << rightval << "=" << result << endl;
return;
}
}
}
cout << "no valid change!" << endl;
}
private:
CInt mleft;
CInt mright;
char msign;
CInt mresult;
};
int main()
{
CMatch match;
cout << "input string" << endl;
char buff[278] = {0};
cin >> buff;
match.parse(buff);
match.match();
return 0;
}
运行结果如下: