甲减在什么医院比较好:一个相当有趣的问题——编程实现

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/30 01:21:50
编号是1、2、……n的n个人按照顺时针方向围坐一圈,每人只有一个密码。一开始任选一个正整数做为报数上限值m,从第一个人开始顺时针方向自1开始顺时针报数,报到m 时停止。报m得人出队,将他的密码作为新的m值,从他在顺时针方向的下一人开始重新报数,如此下去,直到所有的全部出列为止。设计一个程序求出出列顺序。
要求:
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出个人的编号
兄弟们谁会啊
求求你们了、帮帮我啊
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出个人的编号,

这不是传说中的“约瑟夫环”嘛~
C++的:

#include <stdio.h>
#include <iostream.h>
#define n 8 //定义人数
struct node //定义结点
{
node *prior;
int num;
int order;
node *next;
};
int m; //报数值,初始为m
int personNo=n; //当前队列中的人数,减为1时退出循环
static struct node person[n]; //建立结点数组

void setnodes() //建立循环链表
{
for (int k=0;k<n;k++) //分配指针空间
{
person[k].prior=new struct node;
person[k].next=new struct node;
}
for(int i=0;i<n;i++)
{
person[i].order=i+1;
person[i].num=i*2+1; //初始化密码
};
for(int j=1;j<n-1;j++) //建立节点之间的先后关系
{
person[j].prior=&person[j-1];
person[j].next=&person[j+1];
};
person[0].prior=&person[n-1];
person[0].next=&person[1];
person[n-1].prior=&person[n-2];
person[n-1].next=&person[0];
}

void getout() //依次出列
{
cout<<"Input m:";
cin>>m; //由用户给出第一个出列者
node *current;
current=new node;
current=person;
while(personNo)
{
for(m;m>1;m--)
{
current=current->next;
}
m=current->num;
cout<<current->order<<" "; //打印出出列者编号
current->prior->next=current->next;
current->next->prior=current->prior;
current=current->next;
personNo--;
}
}

int main()
{
setnodes();
getout();
return 1;
}