输入一个正整数X,在下面的等式1 2 3 4 5 6 7 8 9 = X,左边的数字之间添加+号或者-号,使得等式成立。


#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;

/*等式变换
描述:    输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。

	   1 2 3 4 5 6 7 8 9 = X

	   比如:
	   12-34+5-67+89 = 5
	   1+23+4-5+6-7-8-9 = 5

	   请编写程序,统计满足该输入整数的所有等式的个数。*/

int  StrToInt(char *pStart,char *pEnd)//将区间[pStart,pEnd]的字符转换为整数
{
	assert(NULL!=pStart && NULL!=pEnd);
	int result = 0;
	while (pStart<=pEnd)
	{
		result = result*10 + *pStart - '0';
		++pStart;
	}
	return result;
}

void OutPrint(int x,int lenth,int *pResult,int *pSymbol_array,int symbol_array_len)
{
	int i,j;
	for (i=0;i<symbol_array_len;++i)
	{
		cout<<x<<" = ";
		for (j=0;j<lenth-1;++j)
		{
			if (1&(pSymbol_array[i]>>j))
				cout<<pResult[j]<<"+";
			else
				cout<<pResult[j]<<"-";
		}
		cout<<pResult[j]<<endl;
	}
}
bool IsEq(int x,int lenth,int *pResult,int *pSymbol_array,int *symbol_array_len)
{
	bool flag = false;
	*symbol_array_len = 0;
	int k = 1<<(lenth-1);
	int sum = pResult[0];
	for (int i=0;i<k;++i)
	{
		sum = pResult[0];
		for (int j=0;j<lenth-1;++j)
		{
			if (1&(i>>j))
				sum+=pResult[j+1];
			else
				sum-=pResult[j+1];
		}	
		if(sum == x)
		{
			flag = true;
			pSymbol_array[(*symbol_array_len)++] = i;
		}
	}
	if(flag)
		return true;
	else
		return false;
}
void EqTransform(int x,char *pStart,int *cnt)
{
	static int results[9] = {0};
	static int index = 0;
	char *pTemp = pStart;
	static int *pSymbol_array = new int[1<<8];
	int symbol_array_len = 0;
	if (*pTemp == '\0' || *pStart == '\0')
	{
		if (IsEq(x,index,results,pSymbol_array,&symbol_array_len))
		{
			(*cnt)+=symbol_array_len;
		    OutPrint(x,index,results,pSymbol_array,symbol_array_len);
		}
		return;
	}
	while (*pTemp!='\0')
	{
		results[index++] = StrToInt(pStart,pTemp);
		EqTransform(x,pTemp+1,cnt);
		--index;
		++pTemp;
	}
}
int main(int argc,char **argv)
{
	char *pStr = "123456789";
	int cnt = 0;
	EqTransform(5,pStr,&cnt);
	cout<<"共"<<cnt<<"种"<<endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值