2025-05-25

還記得小時候增加或移動一根火柴使等式成立的趣味題嗎?嘿嘿,今天就和大傢分享一道面試題,和“火柴題”很像,因此也更像是趣味題,做起來非常有意思O(∩_∩)O。廢話不多說,直接上題:

/*

下面這段C程序想要輸出20個減號,不過,粗心的程序員把代碼寫錯瞭,你需要把下面的代碼修改正確,不過,你隻能增加或是修改其中的一個字符,請你給出三種答案。

*/

int n = 20;

for(int i=0; i<n; i–)

{ printf("-");

}

題目很簡單,相信任何一個程序員都是能看懂的,這題不考復雜的專業知識,當趣味題做就行瞭,註意題目要求“給出三種答案”,不好漏解就好。

下面帖上我的解題思路:

簡單分析一下程序不難看出,“粗心的程序員”把i++寫成瞭i–,導致循環不能執行20次。因此,我們的最終目的就是讓for循環執行20次。題目的要求是隻能增加或修改一個字符,這麼一來,可以修改的也隻有"int n=20"和"for (int i=0;i<n;i–)"這兩行瞭。簡單嘗試一下修改n的數值,很快發現行不通,所以解題的關鍵就是在for循環條件裡下功夫。

首先我們嘗試一下修改"int i=0"中的i值,由於要同時滿足i<20和i-20>=20,即40<=i<20,顯然不可能。

接著,嘗試修改"i<n"這個條件表達式,稍作思考,我們發現如果給i前面加個符號,變成"-i<n",也就是"i>-20",那麼每次循環依次是0>-20,-1>-20 … -19>-20正好能運行20次,符合題意!這樣,第一種解法就出來瞭:

1 int n = 20;

2 for(int i=0; -i<n; i–)

3 {

4 printf("-");

5 }

再看看修改"i–"有沒有希望,改成i++顯然是不行瞭,那改一下變量呢?n–?竟然是可以的!每次循環的條件為0<20,0<19 … 0<1,同樣是20次循環,太神奇瞭!這題告訴我們for(int i=0; i<n; n–)也是能做n次循環的,雖然我們平常幾乎不這麼寫,因為n往往是不可變的(比如特定數組的長度,容器的size等)。解法二:

1 int n = 20;

2 for(int i=0; i<n; n–)

3 {

4 printf("-");

5 }

前兩種解法總體上還是挺容易想到的,第三種就要繞一些瞭,我也是想瞭半天(笨啊o(>﹏<)o)。回到修改"i<n"上,由於在c語言中非0即true,任何一個int值都是可以當佈爾值來使的,因此可以試著把"i<n"換成數值,比如i+n,i-n,i*n等等,而i+n恰好符合題意(很詭異的說~)解法三:

1 int n = 20;

2 for(int i=0; i+n; i–)

3 {

4 printf("-");

5 }

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *