#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;
}
输入一个正整数X,在下面的等式1 2 3 4 5 6 7 8 9 = X,左边的数字之间添加+号或者-号,使得等式成立。
最新推荐文章于 2021-02-10 12:45:36 发布