火柴棒问题

火柴棒问题

用火柴棒摆成的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;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值