php实现约瑟夫的环点名问题
function
rand_number(
$num
)
{
return
rand(0,
$num
);
}
function
outnumber(
$n
,&
$arr
,
$max
)
{
$number
=rand_number(
$max
);
if
(
$number
>
$n
)
$number
=
$number
%
$n
+1;
while
(!
empty
(
$arr
)){
if
(!isset(
$i
)) {unset(
$arr
[
$number
]);var_dump(
$arr
);}
//删除元素
$i
=
$number
;
//需要索引才能找到下一个间距为新$number的元素
$number
=rand_number(
$max
);
//生成下一个随机数
if
(
$number
>
$n
)
$number
=
$number
%
$n
+1;
echo
‘下一个间距‘
.
$number
.
‘元素‘
.
‘<br>‘
;
$count
=0;
$n
=
end
(
$arr
);
while
(
$count
<
$number
){
if
(
$i
>=
$n
)
$i
=1;
//最后一个元素则返回到第一个元素
else
$i
++;
if
(!isset(
$arr
[
$i
])) {
continue
;}
else
{
$count
++;}
//找到一个元素才++
}
unset(
$arr
[
$i
]);
var_dump(
$arr
);
}
}
$max
=100;
$n
=6;
for
(
$i
=1;
$i
<=
$n
;
$i
++)
$arr
[
$i
]=
$i
;
outnumber(
$n
,
$arr
,
$max
);
* 线性表应用(选首领问题)
*
* @param $n 总数
* @param $m 当报数到 m 时,m出列
* @return 最后剩下的数字
*/
function yuesefu($n,$m) {
$r=0;
for($i=2; $i<=$n; $i++) {
$r=($r+$m)%$i;
}
return $r+1;
}
print_r(yuesefu(3,3));
*双向链表实现约瑟夫环
* @author :于燚:qq:496510819
*/
$num=5;
$size=3;
class p{
public $num;//号码
public $next=null;//下一个对象
public function __construct($num){
$this->num=$num;
}
}
//创建第一个对象
$one=new p(1);
$cur=$one;
for($i=2;$i<=$num;$i++){
$p=new p($i);
$cur->next=$p;
$cur=$p;
}
$cur->next=$one;
//开始报数
$i=0;
while($cur->next!=null){
if($i%$size==($size-1)){
$cur->next=$cur->next->next;
if($cur->next==$cur)
break;
}
$cur=$cur->next;
$i++;
}
echo $cur->num;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。