约瑟夫环问题c语言

有 n 个囚犯站成一个圆圈,准备处决。
首先从第一个人开始报数,每报数到 m 的人就会被处决,然後由下一个重新报数
直到只剩下一个人为止,请问最後一个处决的人是第几个人?

求大神帮忙,最好用数组解

  解决问题的核心步骤:
  1.建立一个具有n个链结点,无头结点的循环链表
  2.确定第1个报数人的位置
  3.不断地从链表中删除链结点,直到链表为空
  void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
  {
  /* p为当前结点r为辅助结点,指向p的前驱结点list为头节点*/
  LinkList p,r,list;
  /*建立循环链表*/
  for(int i=0,i<n,i++)
  {
  p=(LinkList)malloc(sizeof(LNode));
  p->data=i;
  if(list==NULL)
  list=p;
  else
  r->link=p;
  r=p;
  }
  p>link=list; /*使链表循环起来*/
  p=list; /*使p指向头节点*/
  /*把当前指针移动到第一个报数的人*/
  for(i=0;i<k;i++)
  {
  r=p;
  p=p->link;
  }
  /*循环地删除队列结点*/
  while(p->link!=p)
  {
  for(i=0;i<m;i++)
  {
  r=p;
  p=p->link;
  }
  r->link=p->link;
  printf("被删除的元素:%4d ",p->data);
  free(p);
  p=r->link;
  }
  printf("\n最后被删除的元素是:%4d",P->data);
  }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-06

#include "stdafx.h"
#define N 5
#define M 8
struct Prisoner
{
char name;
int id;
};
int main(int argc, char* argv[])
{
Prisoner  prisoners[N]; 
for(int i=0;i<N;i++)
{
prisoners[i].id=i;
prisoners[i].name='A'+i;
printf("id=%d, name=%c\n",prisoners[i].id,prisoners[i].name);
}
printf("***************\n");
static int index=0;
static int left=N;
while(1)
{
for(int i=0;i<N;i++)
{
if (prisoners[i].name!='0') {
index++;
if (index%M==0){
printf("id=%d, name=%c\n",prisoners[i].id,prisoners[i].name);
prisoners[i].name ='0';
left -=1;
}
}
}
if(left==0)
{
break;
}
}
printf("Done!\n");
return 0;
}

第2个回答  2014-11-06
main()
{
int n,m,c, b,d,i;
char a[n];
scanf(%d,%d,n,m);
for(i=0;i<n;i++)
{
scanf(%c,a[n]);
}
while(n>m)
{
b=n-m;
d=m;
for(i=0;i<b;i++)
{
c=a[i];
a[i]=a[d+1];
a[d]=c;
d++;
}
--n;
}
printf(%c,a[m]);
}追问

不对呀,跑出来直接就结束了

追答

Alt+F5 查看结果

本回答被网友采纳
相似回答