教大家用計算機求任意張數牌的完美洗牌歸位次數
52張牌8次完美洗之後歸位,那麽不是52張呢?
最開始是想到如果54張會怎樣,我試著洗了20次,未果。我覺得可能要洗很多次,於是沒有繼續洗。小學學過basic語言,於是我找了個Qbasic,編了以下程序,A代表牌的張數(甚至可以輸入單數),運行程序之後的結果就是需要的次數。54張是52次,而2的N次方張牌需要N次,比如262144張牌就需要18次。單數張牌的結果等於單數張加一張牌的結果。也就是說262143張牌也是18次恢復本來次序。注意A要大於2,否則沒有意義。
好久不編程了,想了好幾個小時終于趨近完美。
10 INPUT A
20 IF INT(A / 2) <> A / 2 THEN A = A + 1
30 FOR X = 2 TO A - 1: P = X
40 T = 0
50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
70 IF P = X THEN B = B + 1
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END
90 IF P <> X THEN GOTO 50
100 NEXT
可能有的魔友看不懂,我稍微解釋一下。
10 INPUT A
隨意輸入A(牌的張數)
20 IF INT(A / 2) <> A / 2 THEN A = A + 1
如果A不是偶數,那麽假設張數是A+1張
30 FOR X = 2 TO A - 1: P = X
循環開始 從第X(2)張牌到第A-1張牌(兩頭的牌其實一直不動),該張牌的位置設為P,當然一開始第二張牌就在它本來的位置,也就是P=X,請注意,這裡的=並不是相等的意思,而是=前面的變成和=後面的值相等
40 T = 0
洗牌次數(time)為零,因爲還沒開始嘛
50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70
如果P<A/2+1(可以理解為牌facedown時,從底牌那邊開始數的前27張的位置),那麽P=P*2-1,也就是說,第二張會變成第三張,第三張會變成第五張…… 記一次洗牌次數。
如果該條件不成立,進入下一個語句。
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
如果P > A / 2(可以理解為可以理解為牌facedown時,從頂牌那邊開始數的前27張的位置),那麽P=(P - A / 2) * 2,也就是說,第二張會變成第四張,第三張變成第六張……。 記一次洗牌次數
70 IF P = X THEN B = B + 1
如果P=X,也就是該張牌回到了本來的位置,記有一張牌回到了原位。變量(B)如果不去給予值就是0。
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END
如果除了兩頭的牌其他牌都回到了本來的位置, 並且 已經計算完了頂底兩張以外的所有牌,那麽顯示T,也就是洗牌次數,程序結束。如果該條件不滿足進入下面語句
90 IF P <> X THEN GOTO 50
如果P不等于X,也就是說該張牌沒有回到本來的位置,那麽回到50語句繼續“洗”,直到滿足了p=x,也就是回到原位,那麽該語句(90)的條件就不滿足了,那麽進入下面語句,不去50
100 NEXT 循環到下一張牌,也就是說如果現在是第一次循環的結束,也就是整副牌的第二張牌回到了原位,那就去考慮下一張牌
我本來擔心兩個問題:一個是,單數張的話是否像帖子開頭說的那樣情況和A+1一樣,我試了很多例子,目前沒發現例外,不過我不會證明絕對沒有,不過應該沒問題。另一個問題,就是万一出現洗了一定次數之後一部分牌歸位,而有的沒有歸位怎麽辦,我通過稍微修改程序,試了很多數,沒出現這個問題,也就是說只要一張牌歸位,所有牌都應該會歸位。還是那句話,我沒辦法證明,所以不敢保證。
如果你看到這裡,而且理解了,我也沒白費力氣。謝謝你看我的帖子。不懂儘管問。魔術我是新手,多交流。^^
+++++++++++++++++++++++++++++++++++++
sisisi123:
关于尊驾的意见,在下决定如下:
诚然此帖既可算作魔術知識,又可算作撲克魔術交流,還可算作撲克魔術教學。
然而一贴多发实不可取
鉴于尊驾所发帖子题目的讨论语气
交流区更为合适
王瑶斑竹的处理十分正确
然并非不可更改
我将编辑此贴为教学贴后重新转移回来
并删除多发的两个帖子
感谢支持。
[ 本帖最后由 kazemaru 于 2007-7-29 08:20 编辑 ]