企業面試題:一個三個數的式子,移動其中一根火柴,使等式成立,用程式或實現(可以用偽碼),輸出能成立的等式。
阿新 • • 發佈:2019-02-11
<p><span style="font-size:14px">一個三個數的式子,移動其中一根火柴,使等式成立,用程式或實現(可以用偽碼),輸出能成立的等式。</span></p><p><span style="font-size:14px">注:“+”可以移走一根火柴變成“-”</span></p><p><span style="font-size:14px">例如:</span></p><p><img src="https://img-blog.csdn.net/20140812220142667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGluZ3l1YW5wdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" height="119" width="450" /></p>
#include <stdio.h> /* 定義操作符號,"+"或"-" */ #define SYMBOL_ERROR 0 #define SYMBOL_ADD 1 #define SYMBOL_MINUS 2 /* 定義變化標識,取值原則:3箇中隨便取出n個相加不能等於其中一個數 */ #define FLAG_NO 0 /* 沒有移動 */ #define FLAG_MINUS 10 /* 去一根火柴 */ #define FLAG_ADD 100 /* 增加一根火柴 */ #define FLAG_SELF 1000 /* 拿一根放自己身上另外的位置 */ /* 定義合法移動 */ #define MOVE_TO_ANOTHER 110 /* 10 + 100 + 0,一個數拿一根,放到另一個數上 */ #define MOVE_TO_SELF 1000 /* 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; }