日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

用PHP实现丢手帕问题(约瑟夫问题)

發布時間:2024/6/3 php 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用PHP实现丢手帕问题(约瑟夫问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:有n個人圍成一圈,然后從任意指定的一個?人那里為起點,以m個人為單位,每轉m個人第m個人被殺死。求最后不會被殺死的人。

遺留問題:

在此用php做簡單的實現,php中對遞歸有100次的深度限制,所以在此不用遞歸,用循環;php中處理數組的函數比較多,所以采用順序表(數組),順序表刪除元素比較復雜,所以效率比較低,只能處理10000一下的數據。鏈表中的遍歷比較復雜,同樣會導致效率低下,以后再做順序表與鏈表的結合。

模擬實現:

[php]?view plain?copy
  • class?Dhc??
  • {??
  • ????private?function?dropHandkerchief($start=0,$distance,$menArray)??
  • ????{??
  • ????????$count?=?count($menArray);????
  • ????????$pos?=?$distance?-?1;????
  • ????????$start?=?$start?>?($count-1)???0?:?$start;//開始位置大于總人數則默認從第一個開始????
  • ????????$pos?=?$start?+?$pos;//第一個要被出列的人的位置,pos為下標,所以要?-1;????
  • ????????while($count?>?1)????
  • ????????{????
  • ????????????if($pos?<?$count)//判斷要出列的人的位置是否超出數組大小,超出則減去(或取模)數組大小,從頭開始????
  • ????????????{????
  • ????????????????echo?"第".?$menArray[$pos]?."人出列<br?/>";????
  • ????????????????array_splice($menArray,$pos,1);//刪除要出列的人????
  • ????????????????$count??=?count($menArray);//重新計算大小????
  • ????????????????$pos?+=?$distance?-?1;//下一個要出列的人的位置,pos?為要數的第一個人,所以第?n?個人的下標為?pos?+?n?-1????
  • ????????????}else????
  • ????????????{????
  • ????????????????//$pos?-=?$count;????
  • ????????????????$pos?=?$pos?%?$count;????
  • ????????????}??
  • ????????}????
  • ????????echo?'<br?/>';????
  • ????????echo?"第"?.$menArray[0].?"人被留下";????
  • ????}????
  • ??
  • ????public?function?drop()??
  • ????{??
  • ????????$menArray?=?array();//????
  • ????????$total?=?100;//總人數????
  • ????????$distance?=?50;//間隔人數????
  • ????????$start?=?3;//從第幾個人開始????
  • ????????$i?=?0;????
  • ????????while($i?<?$total)//初始化????
  • ????????{????
  • ????????????$menArray[$i]?=?$i?+?1;????
  • ????????????$i++;????
  • ????????}????
  • ????????$this->dropHandkerchief($start,?$distance,?$menArray);????
  • ????}??
  • }??

  • 數學推導實現:(20170914)

    簡單改變一下問題的描述:有 n 個人,編號是 0 - n-1,從 0 開始數,數到 m 則 m 死,下一個人繼續從 0 開始數,直到只剩最后一個人,求這個人最開始的編號。

    每死一個人就重新開始,相當于減小了問題的規模,就是要解 n 個規模的解:n, n-1, n-2, n-3 …… 3, 2, 1。

    假如在第二輪(n-1個人的規模)中死的那個人編號是 x(這個編號是第一個人死后,重新從 0 開始編排的),則可以推導出這個人在第一輪(人數為 n 時)中的編號是:(x + m)%n。

    (n-2)中死的人在(n-1)中的編號是:(x + m)%(n-1)

    (n-3)中死的人在(n-1)中的編號是:(x + m)%(n-2)

    ……

    ( 1 )中死的人在( 2 )中的編號是:(x + m)%2, 此時 x = 0;

    把上面的過程倒過來,已知規模為 1 時,x = 0;

    求規模為 2 時,x2 的值:(x + m) % 2 = x2

    求規模為 3 時,x3 的值:(x2 + m) % 3 = x3

    ?……

    求規模為 n 時 x 的值。

    [php]?view plain?copy
  • $n?=?100;??
  • $m?=?3;??
  • $s?=?0;??
  • ??
  • $x?=?0;??
  • for?($i=2;?$i<=$n;?$i++)?{??
  • ????$x?=?($x?+?$m)?%?$i;??
  • }??
  • echo?($x?+?$s)?%?$n;??
  • //?$s=0,表示從第?0?個開始數,如果不是從?0?開始,則只需要向后推?$s?個即可?
  • 總結

    以上是生活随笔為你收集整理的用PHP实现丢手帕问题(约瑟夫问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。