谁告诉我约瑟夫环的设计思路啊
发布网友
发布时间:2022-05-30 19:33
我来回答
共3个回答
热心网友
时间:2022-07-08 05:36
约瑟夫环:
约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈
,每人手持一个密码(正整数),开始任意选一个整数作为报数上限值,从第一
个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密
码作为新的m值,从他顺时针下一个人开始重新从1开始报数,如此下去直到所有
的人全部都出列为止。试设计程序实现。
要求:利用循环链表存储结构模拟此过程,按照出列的顺序打印各人的编号。
测试数据:m的值初始为20:密码3 ,1,7,2,4,8,4。
正确的结果:6,1,4,7,2,3,5。
提示:程序运行后首先要求用户指定初始报数上限。然后读取各人的密码。设
n<30。
typedef struct node
{
int num,code;
struct node *next;
}lnode;
void main()
{
int i,j,key,n; /*i,j为记数器,key为输入的密码,n为人的总个数*/
lnode *p,*s,*head;
head=(lnode *)malloc(sizeof(lnode)); /*为头结点分配空间*/
p=head;
printf("Please enter the num of the person:"); /*输入人的总个数*/
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Person %d",i);
printf(" code: ");
scanf("%d",&key); /*输入各个人的密码*/
s=p;
p=(lnode *)malloc(sizeof(lnode)); /*创建新的结点*/
s->next=p;
p->num=i;
p->code=key;
}
p->next=head->next;
p=head;
head=head->next;
free(p);
p=head;
do
{
printf("\nPerson%d Code:%d",p->num,p->code); /*输出链表*/
p=p->next;
}while(p!=head);
printf("\nPlease enter your first key:"); /*输入第一个数*/
scanf("%d",&key);
do
{
j=1; /*j为记数数*/
p=head;
while(j<key)
{
s=p;
p=p->next;
j++;
}
i=p->num;
key=p->code;
printf("\nThe out of the num:");
printf("Person%d",i);
s->next=p->next;
head=p->next; /*重新定义head,下次循环的开始结点*/
free(p);
n--; /*每循环一次人是减1*/
}while(n>0);
getch();
}
热心网友
时间:2022-07-08 05:36
http://hi.baidu.com/ccs%5Fxx/blog/item/93541c1fdcb74ccca78669f8.html
这是我写的 不懂就问 我写的很有特色的
方法就是先采用一个大数组放任的编号 1,2,3,4,5,6,7,8,9,10,1,2,3等等
然后,从开始第一个数每隔三个人取数,每取一次数后,就省掉当前数之后的所有相同的数,然后隔3个取一个数 直到取得数的个数为人的个数和 。总的方法就是多多采用stl
呵呵
热心网友
时间:2022-07-08 05:36
看看百度百科吧,呵呵http://ke.baidu.com/view/717633.html?wtp=tt