火柴棍移動的一道面試題

2021-06-23 04:53:14 字數 1843 閱讀 8213

最近有朋友找工作,面試某公司,遇到乙個火柴棍移動的面試題,感覺有點意思,在此拋磚引玉。

題目大致是這樣的:

乙個三個數的式子,移動其中一根火柴,使等式成立,用程式或實現(可以用偽碼),輸出能成立的等式。

注:「+」可以移走一根火柴變成「-」

例如:

廢話不說,直接上**,哪位網友有更好的方法,請分享一下,多謝

#include /* 定義操作符號,"+"或"-" */

#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

match_stick_s;

/* 獲取乙個數不動或移動一根火柴後得到的數(只列舉3和6,其他數值類似)

入參:指定的數(0-9)

出差:match_stick_s結構陣列

返回值:移動一根火柴得到的數的個數

*/int getdataaftermovestick(int idata, match_stick_s *pststick)

case 6:

default:

}return icount;

}/* 移動火柴

返回值:

symbol_error:非法移動

symbol_minus:從"+"上取一根加到某個數上

symbol_add: 不從"+"取火柴時,移動一根

*/char checkstickmove(int iflag1, int iflag2, int iflag3)

else if(move_from_plus == iflagsum)

return csymbol;

}/* 滿足移動規則,並能使等式成立的,列印出來 */

void printresult(match_stick_s *pststick1, match_stick_s *pststick2, match_stick_s *pststick3)

else if((symbol_minus == csymbol) && (idata3 == idata1 - idata2))

return;

}/* 處理火柴移動 */

void dealstickmove(int idata1, int idata2, int idata3)}}

return;

}int main()

執行結果:

3 + 0 = 3

9 - 6 = 3

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...