约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
//利用数组
int josephu(int n,int m)
{
int *arr;
arr = new int[n];
memset(arr,1,n);
int i=0,j=0;
for ( i = 0;i < n;i++)
{
int flag = 0;
while(flag<m)
{
if (j == n)
{
j = 0;
}
if (arr[j])
{
flag++;
}
j++;
}
arr[j-1]=0;
cout<<"第"<<i<<"个:"<<" "<<j<<endl;
}
delete []arr;
return i;
}
//利用链表
typedef struct Node
{
int data;
struct Node* next;
}Node,*PLink;
int josephu_link(int n,int m)
{
PLink head = NULL;
PLink tail = NULL;
head = new Node;//(PLink)malloc(sizeof(Node));
if(head==NULL)
return -1;
//初始化循环链表
tail = head;
int count = 1;
while(count<=n)
{ tail->data = count;
tail->next = new Node;
tail = tail->next;
count++;
}
tail->data = count;
tail->next = head;
PLink pnode = head;
while(head!=tail)
{
int flag = 1;
while(flag++<m)
{
tail = tail->next;//head
head = head->next;
}
PLink delNode = head;
cout<<delNode->data<<" ";
head = head->next;
tail->next = head;
delete(delNode);
delNode = NULL;
}
return n;
}