題目:有乙個桶,裡面有白球、黑球各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 找規律 使用 黑球個數,白球個數 來表示桶中黑球和白球的個數變動,正數表示增加,負數表示減少,根據規...