有一堆人排成一圈,喊到一个数就出局,最后剩下的人,用c语言用动态链表编程

如题所述

这个问题是有名的约瑟夫问题。

假设有n个人参加报数,依次编号1~n。从编号1开始依次报数,从1报到m,报到m的人出列,剩下来的人重新开始报数,报到m的人出列,如此重复直到所有人都出列为止。最后出列的人原来的编号是多少?

链表程序如下:

#include <stdio.h>
#include<stdlib.h>
struct node
{
int num;
struct node *next;
};
struct node *create(int n)
{
int i;
struct node *p,*head=NULL,*rear;
for(i=0;i<n;i++)
{
p=(struct node *)malloc(sizeof(struct node));
p->num=i+1;
if(head==NULL)
{
head=p;
rear=p;
}
else
{
rear->next=p;
rear=p;
}
}
rear->next=head;
return head;
}

void Del(struct node *head,int n,int m)
{
int i,j;
    struct node *p,*q=head,*front=head;
while(q->next!=head)
q=q->next;
for(j=0;j<n;j++)
{
for(i=1;i<m;i++)
{
q=front;
front=front->next;
}
        printf("%d\t",front->num);
p=front;
q->next=front->next;
front=front->next;
free(p);
}
}

void main()
{
int m,n;
    struct node *head;
printf("输入报到人数n:");
    scanf("%d",&n);
printf("输入报数终值m:");
    scanf("%d",&m);
head=create(n);
    if(n>0 && m>0)
{
Del(head,n,m);
head=0;
}
}

运行结果:

假设10个人参加报数,报到3的人出列,则出列顺序为

最后出列的是原来编号为4的人。

温馨提示:内容为网友见解,仅供参考
无其他回答

有一堆人排成一圈,喊到一个数就出局,最后剩下的人,用c语言用动态链表编 ...
假设有n个人参加报数,依次编号1~n。从编号1开始依次报数,从1报到m,报到m的人出列,剩下来的人重新开始报数,报到m的人出列,如此重复直到所有人都出列为止。最后出列的人原来的编号是多少?链表程序如下:include <stdio.h>#include<stdlib.h>struct node{int num;struct node *next;};struct ...

C语言编程:有n个人围成一圈,按顺序从1到n编号。从第一个人开始,报到3...
{ if(1==a)printf("%d号玩家活到的最后\\n",i+1);} }

C语言:10人围一圈,1到8循环报数,报数为8的出圈到圈中剩一人为止按退出次...
printf ("The winner is %d\\n", s+1);} 说明:只要输入N=10,M=8即可满足你的要求 还可以有其他变化 其中n为总人数 M为报数最大值

C语言问题!10个人围成一个圈!
void main(){ int ren[11] = {0,1,2,3,4,5,6,7,8,9,10};\/\/每人入相应的座位 int i,j,cont;j = 0;cont=0;for(i = 0; i < 11; i++){ if(ren[i]!=0){ j++;if(j == 8)\/\/满足退出条件 { printf("%d ", ren[i]);\/\/输出该人 cont++; \/\/退出人数增加 j=...

C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
最后编号为 5 的人再次开始,数到 2 的人数为 5,因此只剩下编号为 5 的人胜出。通过循环链表,可以高效地模拟上述淘汰过程,实现约瑟夫环问题的解决。循环链表在约瑟夫环问题中的应用揭示了其强大的功能,以及在特定场景下的高效解决方案。通过结合循环链表的特性,可以构建出简洁、高效的代码实现。

...有n个人围成一圈,顺序排号,从第一个人开始(从1-
{ char student[N];\/\/N个人,1表示未退出,0表示已经退出 int out[N];\/\/退出的人的号码记录 int count = -1;\/\/循环计数 0,1,2 <=> 1-3 int num_out = -1;\/\/退出号码记录的数组的下标 memset(student, 1, sizeof(student));\/\/将所有人状态置为1(未退出)for (int i = 0;...

...或3的倍数的人出席,问最后剩下的人是谁?c语言编程
include <stdio.h> int main(){ int i, k, n, t;t = 20;n = 3;for(i = 1; i <= t; ++i)k = (k + n) % i;printf("最后剩下的是第 %d 个人\\n", k+1);return 0;}

C语言:n人围圈m报数的约瑟夫老题,要求见图片,咋编?
p->x=1;p->next=head;\/\/构成环链表就把最后结点的下一结点设为第一个结点 } else{\/\/若某结点申请失败则释放已申请结点并退出 printf("Application memory failure, exit...\\n");dellink(head);\/\/释放已申请结点 return 0;} } for(i=1,t=k=0,p=head;k<n;p=p->next,++t)\/\/按...

有n个人围成一圈,顺序从1开始顺序编号。从第一个人开始报数(从1报到3...
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3,...

用C语言解决一个实际问题(不要太长)
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k为第一个开始报数的人,m为...

相似回答
大家正在搜