三進製與一道經典的砝碼問題

2021-06-05 08:55:58 字數 1785 閱讀 5989

現在我們普遍使用十進位制進行數**算,大概是源於我們的祖先喜歡用手指來計數,畢竟數學首先是一種實用的工具。另一種常使用的進製是二進位制,在計算機運算之中。

日常生活中好像沒有三進製的立足之處。1個季度是3個月,應是三進製,可是我們說1年是4個季度,而不是11個季度。交通訊號的紅綠黃的三種狀態可以表示0、1、2來描述,這似乎與三進製沾上了邊,可是最近紅綠黃燈多變成了紅綠燈,三進製變成了二進位制。

雖然在日常生活中少有表現的機會,但是用三進製就非常容易解決一道關於砝碼的經典趣味數學題。

這道砝碼問題是巴協(bachet)給出的:要想在天平上稱出1到40磅在內的任何整磅數,問最少需要幾個多重的砝碼?這裡有兩種放置砝碼的辦法:(1)所有砝碼只放進天平的一端,(2)砝碼可以放進天平的兩端。

對於(1),砝碼具有兩種狀態,不放或者放。記不放為0,放為1,這個問題可以使用二進位制來解決。二進位制的砝碼重量設定為1、2、4、8、16、32。在1到1+2+4+8+16+32也就是63之內的任何數量都可以用1、2、4、8、16、32中的某幾個數相加得到。所以問題(1)的砝碼數是6個,每個砝碼的重量設定為1、2、4、8、16、32磅。

對於(2),砝碼具有三種狀態,不放、放在天平左端、放在天平右端。記不放為0,放左邊為1,放右邊為-1,這個問題可以使用三進製來解決。在三進製中,砝碼的重量設定為1、3、9、27.。在1到1+3+9+27也就是40之內的任何數量都可以用1、3、9、27中的某幾個數相加或者相減獲得。

我們來看這幾個砝碼是如何稱量1到40的:

1=1;2=3-1;3=3 ;4=3+1;5=9-3-1 ;6=9-3 ; 

7=9-3+1;8=9-1 ;9=9  ;10=9+1 ;11=9+3-1

……35=27+9-1; 36=27+9;37=27+9+1

38=27+9+3-1;39=27+9+3;40=27+9+3+1

這裡,加號意味著天平左邊放置砝碼,減號意味著天平右邊放置砝碼(與被稱重的物體放在同一端)。

如果我們增加兩個砝碼81磅和243磅,用6個砝碼可以就稱重1到364磅的重量。如果砝碼繼續按3的冪次增加重量,則稱重的範圍越來越大。用重量為1、3^2、3^3、……、3^n的n個砝碼可以稱出從1到(3^n-1)/2的所有重量。

問題是,如果乙個被稱物體較重,我們該如何在天平兩端放置砝碼呢?這裡涉及到十進位制向三進製的計算。像十進位制轉化為二進位制一樣,轉化方法就是連續的除法運算(這裡不打算詳細介紹)。

例如,(80)10=(2222)3

等式右邊的含義是,80可以用2個1、2個3、2個9、2個27相加而成。

在天平稱重中,我們要的是最少的砝碼數,我們可以把2變成(10-1)3(簡記為-1),也就是說,乙個大一級的砝碼減去乙個小一級的砝碼。大砝碼放在天平左端,小砝碼和被稱重物一同放在天平右端。

因為,(2222)3=(1000-1)3 

,該式的含義就是用2個1、2個3、2個9、2個27加成的得數等於用1個81減去1的得數。

所以,要稱重80磅的物體,需要在天平左邊放置1個81磅的砝碼,在天平右邊放置乙個1磅的砝碼。

又例如,如果我們用最少的砝碼稱出了乙個331磅的東西,我們究竟用了哪幾個砝碼呢?

因為(331)10=(110021)3=(1101-11)3

所以,要稱重331磅的物體,需要在天平左邊放置1個243磅的砝碼、1個81磅的砝碼、1個9磅的砝碼、1個1磅的砝碼,在天平右邊放置乙個3磅的砝碼。

因為每一次稱量能區別3個球,將12表示為三進製。

在文章的最後,我們把巴協(bachet)的砝碼問題稍稍擴大一些:要想在天平上稱出1到500磅在內的任何整磅數,問最少需要幾個多重的砝碼?這裡有兩種放置砝碼的辦法:(1)所有砝碼只放進天平的一端,(2)砝碼可以放進天平的兩端。

js的一道經典題目

今天碰到一道題,裡面既包含了匿名函式的知識,也包含了預編譯,函式的傳參 形參 感覺迷迷糊糊的,所以想著做個總結。var foo function foo console.log foo.n foo console.log foo.n 上面的 可以寫成這樣,看解釋 1 var foo 2 functi...

js的一道經典題目

今天碰到一道題,裡面既包含了匿名函式的知識,也包含了預編譯,函式的傳參 形參 感覺迷迷糊糊的,所以想著做個總結。var foo function foo console.log foo.n foo console.log foo.n 上面的 可以寫成這樣,看解釋 1 var foo 2 functi...

一道經典的筆試題

題目 給定字串a,字串b,比如a feb b jun 要求結果 befjun 把兩個字串拼寫成乙個有序的字串。不能用系統函式。這個題目曾經出現在 神州數碼,中訊漢揚等公司的筆試題目中。我的解答 static void main string args b astring,bstring string...