1: 从键盘读入一个式子(该式子肯定是一个不成立的等式)。 2:判断,是否可以移动一根木棒可以使等式成立,则输出新的等式,否则输出No。
a.式子中的数只能是正数,运算符号只会出现加号和减号,并且有且仅有一个等号,不会出现括号、乘号或除号,也不会有++,--,+-或-+出现。 b.式子中只能是整数,并且小于10c.你不能移动=的木棒,所以加号、减号、等号是不会改变的。移动前后,木棒构成的数字必须严格与计算机器中显示的效果一致。 d.从键盘读入的式子中的数不会以0开头,但允许修改后等式中的数以数字为开头。
#include /* 定义操作符号,"+"或"-" */ #define SYMBOL_ERROR 0 #define SYMBOL_ADD1 #define SYMBOL_MINUS 2/* 定义变化标识,取值原则:3个中随便取出n个相加不能等于其中一个数 */ #define FLAG_NO0 /* 没有移动 */ #define FLAG_MINUS 10/* 去一根火柴 */ #define FLAG_ADD100/* 增加一根火柴 */ #define FLAG_SELF 1000 /* 拿一根放自己身上另外的位置 *//* 定义合法移动 */ #define MOVE_TO_ANOTHER 110/* 10 + 100 + 0,一个数拿一根,放到另一个数上 */ #define MOVE_TO_SELF1000 /* 1000 + 0 + 0,自己拿一根放自己身上其他位置 */ #define MOVE_FROM_PLUS 100/* 100 + 0 + 0,从加号上拿一根放一个数身上 *//* 定义火柴移动结构体 */ typedef struct matchstick { int iFlag; /* 变化标识 */ int iData; /* 火柴表示的数 */ }MATCH_STICK_S;/*获取一个数不动或移动一根火柴后得到的数(只列举3和6,其他数值类似)入参:指定的数(0-9)出差:MATCH_STICK_S结构数组返回值:移动一根火柴得到的数的个数 */ int getDataAfterMoveStick(int iData, MATCH_STICK_S *pstStick) { int iCount = 0;switch(iData) { case 3: { pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 3;/* 不动 */ pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 9; /* 加一根 */ pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 2; /* 自己移动一根 */ pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 3; pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 5; iCount = 5; break; } case 6: { pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 6;/* 不动 */ pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 8;/* 加一根 */ pstStick[5].iFlag = FLAG_MINUS; pstStick[5].iData = 5; /* 减一根 */ pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 0; /* 自己移动一根 */ pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 6; pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 9; iCount = 6; break; } default: { break; } }return iCount; }/* 移动火柴 返回值: SYMBOL_ERROR:非法移动 SYMBOL_MINUS:从"+"上取一根加到某个数上 SYMBOL_ADD: 不从"+"取火柴时,移动一根*/ char checkStickMove(int iFlag1, int iFlag2, int iFlag3) { char cSymbol = SYMBOL_ERROR; int iFlagSum = iFlag1 + iFlag2 + iFlag3;if((MOVE_TO_ANOTHER == iFlagSum) || (MOVE_TO_SELF == iFlagSum)) { cSymbol = SYMBOL_ADD; } else if(MOVE_FROM_PLUS == iFlagSum) { cSymbol = SYMBOL_MINUS; }return cSymbol; }/* 满足移动规则,并能使等式成立的,打印出来 */ void printResult(MATCH_STICK_S *pstStick1, MATCH_STICK_S *pstStick2, MATCH_STICK_S *pstStick3) { int iFlag1 = pstStick1->iFlag; int iFlag2 = pstStick2->iFlag; int iFlag3 = pstStick3->iFlag; int iData1 = pstStick1->iData; int iData2 = pstStick2->iData; int iData3 = pstStick3->iData;char cSymbol = checkStickMove(iFlag1, iFlag2, iFlag3);if((SYMBOL_ADD == cSymbol) && (iData3 == iData1 + iData2)) { printf("%d + %d = %d\n", iData1, iData2, iData3); } else if((SYMBOL_MINUS == cSymbol) && (iData3 == iData1 - iData2)) { printf("%d - %d = %d\n", iData1, iData2, iData3); }return; }/* 处理火柴移动 */ void dealStickMove(int iData1, int iData2, int iData3) { unsigned long ulLoop1, ulLoop2, ulLoop3; int iCount1, iCount2, iCount3; MATCH_STICK_S astStick1[10]; MATCH_STICK_S astStick2[10]; MATCH_STICK_S astStick3[10];iCount1 = getDataAfterMoveStick(iData1, astStick1); iCount2 = getDataAfterMoveStick(iData2, astStick2); iCount3 = getDataAfterMoveStick(iData3, astStick3);for(ulLoop1 = 0; ulLoop1 < iCount1; ulLoop1++) { for(ulLoop2 = 0; ulLoop2 < iCount2; ulLoop2++) { for(ulLoop3 = 0; ulLoop3 < iCount3; ulLoop3++) { printResult(&astStick1[ulLoop1], &astStick2[ulLoop2], &astStick3[ulLoop3]); } } }return; }int main() { dealStickMove(3, 6, 3);return 0; }