一、實驗題目:約瑟夫環問題:設編號為1,2,3,……,n的n(n>0)個人按順時針方向圍坐一圈,m為任意一個正整數。從第一個人開始順時針方向自1起順序報數,報到m時停止並且報m的人出列,再從他的下一個人開始重新從1報數,報到m時停止並且報m的人出列。如此下去,直到所有人全部出列為止。要求設計一個程序模擬此過程,對任意給定的m和n,求出出列編號序列。實驗要求:用順序表實現。
二、設計分析:
首先創建了一個順序表,並且用數組存每個人的編號,出列的時候將此編號置為0,代表此位置的人已經出列,循環查詢編號不為0的元素,並用變量j記下當前是第幾個人,當j==m的時候,代表此位置是第m個人,輸出並將編號置為0,用k記錄出列人的下一位的索引,並將數組長度-1,再進行新一輪的循環,直到所有人都出列。
三、程序代碼:
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=100;
typedef struct Node{
int data[MaxSize];
int length;
}List;
void CreateList(List *&L,int n){
L=(List *)malloc(sizeof(List*));
for(int i=1;i<=n;i++){
L->data[i]=i;
}
L->length=n;
}
void DispList(List *&L,int m){
int len=L->length;
int j=0,k=1;
while(L->length){
for(int i=1;i<=len;i++){
if(L->data[k]){
j++;
}
if(j==m){
cout<<L->data[k]<<" ";
L->data[k]=0;
L->length--;
j=0;
k=(k+1)%(len+1)?(k+1)%(len+1):1;
break;
}
k=(k+1)%(len+1)?(k+1)%(len+1):1;
}
}
}
int main(){
int m,n;
cin>>m>>n;
List *L;
CreateList(L,n);
DispList(L,m);
return 0;
}