求C语言实现约瑟夫环!
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/05 21:06:59
求C语言实现约瑟夫环!
1.编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止.设计一个程序来求出出列顺序.
2.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号.程序开始执行时输入人数n及各人密码和m的初值,得出输出序列.
我在网上找到一些代码,但是不是很懂,求有详细注释的代码(就是中间过程基本都有注释的),
1.编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止.设计一个程序来求出出列顺序.
2.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号.程序开始执行时输入人数n及各人密码和m的初值,得出输出序列.
我在网上找到一些代码,但是不是很懂,求有详细注释的代码(就是中间过程基本都有注释的),
我们学校OJ上面提交通过了的.就是一个链表里面 存储四个变量sum:序列编号也就是这是第几个数2.number:这个数的值3.flag先全部赋值为1,如果被抽到就赋值为0表示被踢出去了.这类型的指针你要是要注释,待会有空写.
#include <stdio.h>
#include "stdlib.h"
#include<iostream>
using namespace std;
#include<cstdlib>
typedef struct DNode
{
int sum;
int number;
int flag;
struct DNode *next;
}sqlist;
sqlist *head,*up,*down,*down2;
int sum1=1;
int n;
void insert(int data)
{
sqlist *up=(sqlist *)malloc(sizeof(sqlist));
if (head==NULL)
{
down=head=up;
head->sum=sum1++;
up->number=data;
up->flag=1;
head->next=NULL;
}
else
{
down->next=up;
up->sum=sum1++;
up->number=data;
up->flag=1;
up->next=NULL;
down=up;
}
}
void FindAndrePlace(int k)
{
int sum=0,sn=1,snn=n;
up=head;
while(n--)
{
while(1)
{
if(up->flag==1)
{
sum++;
}
if(sum==k&&up->flag==1)
{
if(sn==snn)
{printf("%d",up->number);}
sn++;
up->flag=0;
sum=0;
break;
}
if(up->next==NULL){up=head;}
else {up=up->next;}
}
}
}
int main()
{
down=up=head=NULL;
int data,k,i;
cin>>n;
for(i=1;i<=n;i++)
{
data=i;
insert(data);
}
int local=1;
cin>>k;
if(n==1){printf("1");}
else{
FindAndrePlace(k);}
return 0;
}
#include <stdio.h>
#include "stdlib.h"
#include<iostream>
using namespace std;
#include<cstdlib>
typedef struct DNode
{
int sum;
int number;
int flag;
struct DNode *next;
}sqlist;
sqlist *head,*up,*down,*down2;
int sum1=1;
int n;
void insert(int data)
{
sqlist *up=(sqlist *)malloc(sizeof(sqlist));
if (head==NULL)
{
down=head=up;
head->sum=sum1++;
up->number=data;
up->flag=1;
head->next=NULL;
}
else
{
down->next=up;
up->sum=sum1++;
up->number=data;
up->flag=1;
up->next=NULL;
down=up;
}
}
void FindAndrePlace(int k)
{
int sum=0,sn=1,snn=n;
up=head;
while(n--)
{
while(1)
{
if(up->flag==1)
{
sum++;
}
if(sum==k&&up->flag==1)
{
if(sn==snn)
{printf("%d",up->number);}
sn++;
up->flag=0;
sum=0;
break;
}
if(up->next==NULL){up=head;}
else {up=up->next;}
}
}
}
int main()
{
down=up=head=NULL;
int data,k,i;
cin>>n;
for(i=1;i<=n;i++)
{
data=i;
insert(data);
}
int local=1;
cin>>k;
if(n==1){printf("1");}
else{
FindAndrePlace(k);}
return 0;
}
急求 约瑟夫C语言的问题
约瑟夫环问题,用C语言编写
C语言编的约瑟夫问题(猴子选大王)求大神看哪里错了
C语言 约瑟夫环问题:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.
c语言实现输出1~100内质数,求思路.
C语言用二维数组实现矩阵求逆
C语言怎么实现四则运算
DES加密算法C语言实现
求做一个C语言题目约瑟夫问题.M个人围成一个圈,从第一个人开始报数,数到N的人出圈,再由下一个人开始报数,数到N的人出圈
ACM约瑟夫环数学问题
本人碰见一道C语言难题,利用C语言实现:求任意两个集合的交集、并集、差集,
数据结构:用链表实现两个多项式相加,用C++或者C语言实现多项式相加,求完整代码