?? josephus.cpp
字號(hào):
//約瑟夫環(huán)
#include"stdio.h"
#include"iostream.h"
#include"malloc.h"
typedef struct LNode
{
int data;
struct LNode *link;
}LNode,*LinkList;
void main()
{
void JOSEPHUS(int n,int k,int m);
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
JOSEPHUS(n,k,m);
}
void JOSEPHUS(int n,int k,int m) //n為總?cè)藬?shù),k為第一個(gè)開(kāi)始報(bào)數(shù)的人,m為出列者喊到的數(shù)
{
/* p為當(dāng)前結(jié)點(diǎn) r為輔助結(jié)點(diǎn),指向p的前驅(qū)結(jié)點(diǎn) list為頭節(jié)點(diǎn)*/
LinkList p,r,list=NULL;
/*建立循環(huán)鏈表*/
for(int i=0;i<n;i++)
{
p=(struct LNode *)malloc(sizeof(LNode));
p->data=i;printf("%2d ",i);
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
printf("\n");
p->link=list; /*使鏈表循環(huán)起來(lái)*/
p=list; /*使p指向頭節(jié)點(diǎn)*/
/*把當(dāng)前指針移動(dòng)到第一個(gè)報(bào)數(shù)的人*/
for(i=0;i<k;i++)
{
r=p;
p=p->link;
}
/*循環(huán)地刪除隊(duì)列結(jié)點(diǎn)*/
while(p->link!=p)
{
for(i=0;i<m;i++)
{
r=p;
p=p->link;
}
r->link=p->link;
printf("%2d,",p->data);
free(p);
p=r->link;
}
printf("%2d\n",p->data);
}
/* 約瑟夫環(huán):
已知n個(gè)人(以編號(hào)1,2,3...n分別表示)圍坐在一張圓桌周?chē)?從編號(hào)為k的人開(kāi)始報(bào)數(shù),數(shù)到m的那個(gè)人出列;他的下一個(gè)人又從1開(kāi)始報(bào)數(shù),
數(shù)到m的那個(gè)人又出列;依此規(guī)律重復(fù)下去,直到圓桌周?chē)娜巳砍隽小?*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -