kazemaru 2007-7-20 20:49
教大家用計算機求任意張數牌的完美洗牌歸位次數
52張牌8次完美洗之後歸位,那麽不是52張呢?9uR2k{pVyxb$O
6iwa"hd
[size=12px][size=12px]最開始是想到如果54張會怎樣,我試著洗了20次,未果。我覺得可能要洗很多次,於是沒有繼續洗。小學學過basic語言,於是我找了個Qbasic,編了以下程序,A代表牌的張數(甚至可以輸入單數),運行程序之後的結果就是需要的次數。54張是52次,而2的N次方張牌需要N次,比如262144張牌就需要18次。單數張牌的結果等於單數張加一張牌的結果。也就是說262143張牌也是18次恢復本來次序。注意A要大於2,否則沒有意義。
R'|
brTfZ6xk)f
/Wu1v:{8].B
好久不編程了,想了好幾個小時終于趨近完美。hz*Jx0] [V
10 INPUT A
&Eg
v1j6I{9Xve/`
20 IF INT(A / 2) <> A / 2 THEN A = A + 1
L8]%R7Z!\
|
30 FOR X = 2 TO A - 1: P = Xfn2[Y!w
40 T = 0
8\*t/u*} t},y.~(r$tD
50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70UcFl6F Pa0j8YG4Ju
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
@)X$C5x._
70 IF P = X THEN B = B + 1)?0FB&vFU,o
?|"jZ
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END/n
H)D O I]!S
90 IF P <> X THEN GOTO 50v?$uJLzr
100 NEXT
7MtNG)F(`5d(Atn
4G3l&UJT"D9K
可能有的魔友看不懂,我稍微解釋一下。
%R4K
YT'R'h@D7i
10 INPUT A
Bw'tUP7[_
隨意輸入A(牌的張數)6YVgCn%w6c$a
2a;a
YhjO`l$V
20 IF INT(A / 2) <> A / 2 THEN A = A + 1 ^-\:O%Y-Ip
如果A不是偶數,那麽假設張數是A+1張
,M};z%c!J:F
&H,y9t6[8llw`
l
30 FOR X = 2 TO A - 1: P = X *rY$xl3M
循環開始 從第X(2)張牌到第A-1張牌(兩頭的牌其實一直不動),該張牌的位置設為P,當然一開始第二張牌就在它本來的位置,也就是P=X,請注意,這裡的=並不是相等的意思,而是=前面的變成和=後面的值相等
/[3szJ&cIm
g)@-KE h2HxK
40 T = 0
ucAyrF_%I
洗牌次數(time)為零,因爲還沒開始嘛
+P-G EPf;C.}
(CZqe;X)a
50 IF P < A / 2 + 1 THEN P = P * 2 - 1: T = T + 1: GOTO 70
C,V%O(rm
如果P<A/2+1(可以理解為牌facedown時,從底牌那邊開始數的前27張的位置),那麽P=P*2-1,也就是說,第二張會變成第三張,第三張會變成第五張…… 記一次洗牌次數。 %myj izb
如果該條件不成立,進入下一個語句。
1l%T'v B3DghY XG
b8VZ?N*w"w
60 IF P > A / 2 THEN P = (P - A / 2) * 2: T = T + 1: GOTO 70
7cC,Y?0M
y;^$OX;D
如果P > A / 2(可以理解為可以理解為牌facedown時,從頂牌那邊開始數的前27張的位置),那麽P=(P - A / 2) * 2,也就是說,第二張會變成第四張,第三張變成第六張……。 記一次洗牌次數
L+pL ^J1y
-B6} ?)w4ht\te!]T
70 IF P = X THEN B = B + 1
$?7B1Y]GPJ
如果P=X,也就是該張牌回到了本來的位置,記有一張牌回到了原位。變量(B)如果不去給予值就是0。%M3J"ji/mZ'U5T\
4k}u I9RL2S3r/x_
80 IF B = A - 2 AND X = A - 1 THEN PRINT T: END
2SU
OQ6eD(lEf+f
如果除了兩頭的牌其他牌都回到了本來的位置, 並且 已經計算完了頂底兩張以外的所有牌,那麽顯示T,也就是洗牌次數,程序結束。如果該條件不滿足進入下面語句3L6c P*uXRG/K'y
3^K4_'s|(b
90 IF P <> X THEN GOTO 50
L%G e9LaVR;g5X
如果P不等于X,也就是說該張牌沒有回到本來的位置,那麽回到50語句繼續“洗”,直到滿足了p=x,也就是回到原位,那麽該語句(90)的條件就不滿足了,那麽進入下面語句,不去50
L%n%Kk[5p(Xkw
100 NEXT 循環到下一張牌,也就是說如果現在是第一次循環的結束,也就是整副牌的第二張牌回到了原位,那就去考慮下一張牌md0ZK
o`4IB0`cX'r
oE^)^
I fN7F
我本來擔心兩個問題:一個是,單數張的話是否像帖子開頭說的那樣情況和A+1一樣,我試了很多例子,目前沒發現例外,不過我不會證明絕對沒有,不過應該沒問題。另一個問題,就是万一出現洗了一定次數之後一部分牌歸位,而有的沒有歸位怎麽辦,我通過稍微修改程序,試了很多數,沒出現這個問題,也就是說只要一張牌歸位,所有牌都應該會歸位。還是那句話,我沒辦法證明,所以不敢保證。/~+V Np!B'w~
R}bE#tay-G9eJ
如果你看到這裡,而且理解了,我也沒白費力氣。謝謝你看我的帖子。不懂儘管問。魔術我是新手,多交流。^^[/size][/size]{
et7l}(G5aW#q
[size=12px][/size]_;J-]U4gw8[
e
[size=12px]+++++++++++++++++++++++++++++++++++++[/size]
`-O'F[2I(K*h~:YKC
Y_XPC3nP
[color=red]sisisi123:[/color]
}(V!\6\r Fl7RcJ b
[color=red][/color]
|F'E{\
[color=red]关于尊驾的意见,在下决定如下:[/color],Py5B+m+mP hw7Z|/q
[color=red]诚然此帖既可算作魔術知識,又可算作撲克魔術交流,還可算作撲克魔術教學。[/color]
2Nye;F2yrG
[color=red]然而一贴多发实不可取[/color]X/x PY[t h8t
[color=red]鉴于尊驾所发帖子题目的讨论语气[/color]J[i.gRf,^
[color=red]交流区更为合适[/color]
4Hh)H
FH
[color=red]王瑶斑竹的处理十分正确[/color]JjvCO
[color=red]然并非不可更改[/color]3?+eRF2C)M#N2md
[color=red]我将编辑此贴为教学贴后重新转移回来[/color]
#w\%]_:\H$H!p1U
[color=red]并删除多发的两个帖子[/color]
%M)Y/XFbo#l
[color=red]感谢支持。[/color]gVW%e3Z-C
[size=12px]0du4UIEfNd m'C2e
5O+}4I$Do4Oj!T
[/size]
A^l5rl+D"K
7ZfU3ge#L!C4J;c
[[i] 本帖最后由 kazemaru 于 2007-7-29 08:20 编辑 [/i]]
caopcao 2007-7-20 22:04
晕,用得着这么算吗,洗8次就知道了啊。肯定是回到原来顺序的
sisisi123 2007-7-21 00:30
很不错的思路
/z:X]8A q
#q;cY3b~
F3?(U#U,T
不过以后能不能用C语言表达?
+~ft/]9_
vs7q1p!H&e