程式設計之美 黑白球問題

2021-07-01 19:05:25 字數 1283 閱讀 3821

題目:有乙個桶,裡面有白球、黑球各100個,人們必須按照以下的規則把球取出來:

1、每次從桶裡面拿出來兩個球;

2、如果是兩個同色的球,就再放入乙個黑球;

3、如果是兩個異色的球,就再放入乙個白球;

問:最後桶裡面只剩下乙個黑球的概率是多少?

思路1:找規律

使用(黑球個數, 白球個數)來表示桶中黑球和白球的個數變動,正數表示增加,負數表示減少,根據規則找規律:

1、如果每次從桶裡面拿出兩個白球,則應放入乙個黑球:(0, -2) + (1, 0) = (1, -2);

2、如果每次從桶裡面拿出兩個黑球,則應放入乙個黑球:(-2, 0) + (1, 0) = (-1, 0);

3、如果每次從桶裡面拿出乙個白球和乙個黑球,則應放入乙個白球:(-1, -1) + (0, 1) = (-1, 0);

從以上各種情況可以看出以下規律:

1)每次都會減少乙個球,那麼最後的結果肯定是桶內只剩乙個球,要麼是白球,要麼是黑球;

2)每次拿球後,白球的數目要麼不變,要麼兩個兩個地減少;

所以,從上面的分析可以得知,最後不可能只剩下乙個白球,那麼必然就只能是黑球了。

思路2:使用數學方法

根據取球規則聯想到數學中異或(xor):

1、兩個相同的數,異或等於0;

2、兩個不同的數,異或等於1;

將黑球看作0,白球看作1,那麼對於每次的操作可以做這樣的想象:每次撈起兩個數字做一次異或操作,並將所得的結果再次丟回桶中,

因此最後的結果實際上相當於把所有的球都進行一次異或運算,最後所得的結果即為最後剩餘的球。

即0 xor 1 xor 1 ……之類的情況,又因為異或滿足結合律,上式可變為:

(0 xor 0 …… xor 0) xor (1 xor 1 …… xor 1)兩邊都是100個,結果就是0(因為各有100個,即0和1各為偶數個,根據異或運算規律,知道結果為0

異或運算規律:

1)偶數個1異或,結果為0;

2)偶數個0異或,結果為0;

3)奇數個1異或,結果為1;

4)奇數個0異或,結果為0:

**實現:

#includeusing namespace std;

int fun(int m,int n)//m是黑球,n是白球數量

int main()

{ int black,white;

cin>>black>>white;

int result=fun(black,white);

cout<

程式設計之美 桶中取黑白球問題

有乙個桶,裡面有白球 黑球各100個,人們必須按照以下規則把球取出來 每次從桶裡面拿兩個球 如果是兩個同色的球,就再放入乙個黑球 如果是兩個異色的球,就再放入乙個白球。問題是 最後桶裡面只剩下乙個黑球的概率是多少?針對這樣乙個問題,我們有兩種不一樣的解法 方法一 首先,我們可以通過相應的數學式來建立...

程式設計之美 桶中取黑白球

題目 有乙個桶,裡面有白球 黑球各100個,人們必須按照以下的規則把球取出來 1 每次從桶裡面拿出來兩個球 2 如果是兩個同色的球,就再放入乙個黑球 3 如果是兩個異色的球,就再放入乙個白球 解法一 用黑白球各兩個,來模擬,從小到多,化繁為簡,進行分析和推斷,找出其內在的規律,並歸納總結。推斷出 每...

程式設計之美 4 6 桶中取黑白球

題目 有乙個桶,裡面有白球 黑球各100個,人們必須按照以下的規則把球取出來 1 每次從桶裡面拿出來兩個球 2 如果是兩個同色的球,就再放入乙個黑球 3 如果是兩個異色的球,就再放入乙個白球 思路1 找規律 使用 黑球個數,白球個數 來表示桶中黑球和白球的個數變動,正數表示增加,負數表示減少,根據規...