导航:首页 > 编程语言 > php约瑟夫环

php约瑟夫环

发布时间:2023-03-07 16:33:50

⑴ 约瑟夫环的算法例子

递归法: #include<stdio.h>#include<stdlib.h>struct_Node{intdata;struct_Node*next;};typedefstruct_Nodenode_t;typedefstruct_Linklist{node_t*phead;node_t*ptail;intlen;}Linklist;staticnode_t*GetNode(inti)//新建并初始化节点{node_t*pNode;pNode=(node_t*)malloc(sizeof(node_t));if(!pNode){printf(Error,thememoryisnotenough! );exit(-1);}pNode->data=i;pNode->next=NULL;returnpNode;}voidinit_list(Linklist*plist)//用第一个节点初始化循环单链表{node_t*p;p=GetNode(1);//printf(TheNewNodeis:%d ,p->data);//****TEST****plist->phead=p;plist->ptail=p;p->next=plist->phead;plist->len=1;}staticvoidCreate_List(Linklist*plist,intn)//把其余数据添加到循环单链表中{inti=0;node_t*pNew;for(i=2;i<=n;i++){pNew=GetNode(i);/********TEST********printf(TheNewNodeis:%d ,pNew->data);********TEST********/plist->ptail->next=pNew;plist->ptail=pNew;pNew->next=plist->phead;plist->len++;}printf(Completesthee-! );}voidPrint_List(Linklist*plist)//输出链表内容{node_t*pCur=plist->phead;do{printf(The%dperson. ,pCur->data);pCur=pCur->next;}while(pCur!=plist->phead);printf(ThelengthoftheList:%d ,plist->len);}约瑟夫回环函数实现voidjoseph(Linklist*plist,intm)//约瑟夫回环函数实现{node_t*pPre=plist->ptail;node_t*pCur=plist->phead;inti;while(plist->len!=1){i=0;while(i<m-1){pPre=pPre->next;i++;}pCur=pPre->next;pPre->next=pCur->next;free(pCur);plist->len--;}printf(Thelastoneis:%d ,pPre->data);}intmain(){intn=0;printf(:);scanf(%d,&n);intm=0;printf(PleaseinputtheStoppoint:);scanf(%d,&m);LinklistpList;init_list(&pList);Create_List(&pList,n);Print_List(&pList);joseph(&pList,m);return0;}

非递归法: #include<stdio.h>#defineM200intmaininttemp=0;intb=1,k=0;for(inti=1;i<=M;i++)temp=b+3*k;if(i==temp)//规则2:若上一组数字为最后保留号与人数相等,则下一数从2开始记。b=2;k=0;continue;elseif(i-temp==1)//规则1:若上一组数字为最后保留号比人数少一,则下一数从1开始记。{b=1;k=0;continue;}k++;printf(%d%d,M,temp);return0;【php模拟】php有非常完善的数据结构模拟方案,可以非常简洁的解决这样的问题.当然数量级太大那还是使用数学方法吧!$m>$n的情况也能行,想优化效率不知道该怎么写了.请大神补充吧!functionking($n,$m){$monkey=range(1,$n);//模拟建立一个连续数组$i=0;while(count($monkey)>1){$i+=1;//开始查数$head=array_shift($monkey);//直接一个一个出列最前面的猴子if($i%$m!=0){array_push($monkey,$head);//如果没数到m或m的倍数,则把该猴放回尾部去.}//否则就抛弃掉了}return$monkey[0];}echo'剩余',king(3,4),'号猴子'; (defun josephus-main )
(let (lt (make-array 20 :fill-pointer 0)
(dotimes (var 20)
(vector-push var lt)
(josephus-loop lt)
(defun josephus-loop(lt)
(if (= (length lt) 1)
(progn
(format t ~a~% lt)
(return-from josephus-loop)
(if (>= (length lt) 5)
(progn
(let (setv (remove (elt lt 4)lt)
(josephus-loop setv)
(progn
(let (setv (remove (elt lt (if (= (length lt) (- 4 (length lt) (- 4 (length lt) 1) (- 4 (length lt) lt)
(josephus-loop setv) program Josephus(input,output);
type pointer=^nodetype;
nodetype=record
data:integer;
link:pointer
end;
var head,next,last:pointer;
i,n,s,j,m,k:integer;
begin
writeln('请输入组成约瑟夫环的人数:');
read(n);
new(head);
head^.data :=1;
last:=head;
for i:=2 to n do
begin
new(next);
next^.data :=i;
last^.link :=next;
last:=next
end;
last^.link :=head;
next:=head;
repeat
begin
writeln(next^.data);
next:=next^.link
end;
until next=head;
readln;
next:=head;
writeln('请输入第一个报数人的位置:');
read(s);
j:=1;
if s<=n
then
while j<s do
begin
next:=next^.link ;
j:=j+1
end
else writeln('你的输入有误');
writeln('请输入出列人的位置:');
read(m);
while next^.link <>next do
begin
k:=1;
while k<m do
begin
last:=next;
next:=next^.link ;
k:=k+1
end;
writeln(next^.data);
last^.link :=next.link ;
next:=next^.link
end;
writeln(next^.data);
readln;
readln
end. define('N',1000);//总数define('P',rand(1,N));//开始报数的位置define('M',rand(1,N/2));//报数的间距/***方法一:通过循环遍历得到结果*如果N,M比较大的话,此方法不建议使用,因为实在太LOW了*/functiongetSucessUserNum(){$data=range(0,N);unset($data[0]);if(empty($data))returnfalse;//第一个开始报数的位置$p=P;while(count($data)>1){for($i=1;$i<M;$i++){$p=(isset($data[$p]))?$p:getExistNumPosition($data,$p);$p++;$p=($p==N)?$p:$p%N;}$p=(isset($data[$p]))?$p:getExistNumPosition($data,$p);unset($data[$p]);$p=($p==N)?1:$p+1;}$data=array_values($data);echo<br>successfulnum:.$data[0].<br><br>;}/***获取下一个报数存在的下标*$data当前存在的数据*$p上一个报名数的下标*/functiongetExistNumPosition($data,$p){if(isset($data[$p]))return$p;$p++;$p=($p==N)?$p:$p%N;returngetExistNumPosition($data,$p);}/***方法二:通过算法得到结果*此方法比方法一快多了,不行自己试一下*/functiongetSucessUserNum(){$data=range(1,N);if(empty($data))returnfalse;//第一个报数的位置$start_p=(P-1);while(count($data)>1){//报到数出列的位置$del_p=($start_p+M-1)%count($data);if(isset($data[$del_p])){unset($data[$del_p]);}else{break;}//数组从新排序$data=array_values($data);$new_count=count($data);//计算出在新的$data中,开始报数的位置$start_p=($del_p>=$new_count)?($del_p%$new_count):$del_p;}echo<br>successfulnum:.$data[0].<br><br>;}

⑵ 零基础自学算法看什么书

既然是自学,途径无非就是看书和看视频两种途径。这些资料,今天已经非常的丰富了。每个人都可以有很多选择。
但这就带来另一个问题:究竟该从什么书,什么视频开始呢?
巧了!!我用过一个学习算法的网站,只适合小白。哈哈。
你可以搜索 1024fun乐学编程 让后学习其中的乐学编程课程
就是,免费!,缺点就是只有基础课程。你去看一下。

阅读全文

与php约瑟夫环相关的资料

热点内容
scan调度算法详细过程 浏览:163
二手房交易系统源码 浏览:136
文件夹怎么快速去重 浏览:790
单片机原理与应用视频资源 浏览:880
云服务器国内如何注册 浏览:584
java值类型和引用类型 浏览:515
金山词霸如何pdf取词 浏览:733
t3软加密解绑 浏览:399
s8sp加密路线直接下载 浏览:570
不许宣读命令 浏览:698
寻找信号源源码 浏览:81
打电话老服务器错误是什么原因 浏览:491
三维溯源码 浏览:716
android录音开源 浏览:459
弗洛伊德算法c 浏览:12
udp命令字 浏览:663
app服务端java源码 浏览:798
电脑用文件夹玩大型游戏 浏览:254
安卓耳塞失灵怎么办 浏览:765
华三交换机保存命令 浏览:605