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

来源:互联网 发布:yield java释放锁 编辑:程序博客网 时间:2024/05/22 18:11

#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]<<"+";elsecout<<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];elsesum-=pResult[j+1];}if(sum == x){flag = true;pSymbol_array[(*symbol_array_len)++] = i;}}if(flag)return true;elsereturn 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;}

0 0