已知n個人(以編號1,2,3...n分別表示)圍坐在壹張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下壹個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。
問題描述的還恰當吧?
解決問題的核心步驟:
1.建立壹個具有n個鏈結點,無頭結點的循環鏈表
2.確定第1個報數人的位置
3.不斷地從鏈表中刪除鏈結點,直到鏈表為空
c++程序代碼如下,僅供參考:
#include <iostream>
using namespace std;
struct monkey {//鏈表節點
int num;
monkey *next;
};
monkey *head,*tail;//全局變量
void create(int n){//創建鏈表
int i;
monkey *p,*q;
p=new monkey;
p->num=1;
p->next=NULL;
head=p;
q=p;
for(i=2;i<=n;i=i++){
p=new monkey;
p->num=i;
q->next=p;
q=p;
p->next=NULL;
}
tail=q;
tail->next=head;
}
void select(int m,int k){//確定開始位置,和依次出圈的序號
int x=0,h=1;
int num=1;
monkey *p,*q;
q=tail;
for(;h<k;){
p=q->next;
h++;
q=p;
}//開始位置確定
do{//依次確定出圈順序並輸出序號和順序號
p=q->next;
x=x+1;
if(x%m==0){
cout<<" "<<num<<": "<<p->num<<endl;
num++;
q->next=p->next;
delete p;
p=NULL;
}
else
q=p;
}while(q!=q->next);
head=q;
}
int main(){
int n,m,k;
head=NULL;
cout<<"請輸入圍坐在壹起的總數目:";
cin>>n;
cout<<"請輸入間隔規此m值:";
cin>>m;
cout<<"請輸入開始位置的序號:";
cin>>k;
if(k>n){
cout<<"妳的輸入有誤!程序結束!"<<endl<<endl;
return 1;
}
else{
create(n);
cout<<"依次出圈的的編號為:"<<endl<<endl;
cout<<" 次序 編號 "<<endl<<endl;
select(m,k);
cout<<endl<<"最後出圈的是"<<head->num<<"號";
delete head;
cout<<endl<<endl;
return 0;
}
}
說明:這是我以前看程序編程基礎時做的小練習。當時,代碼參考了吳文虎編著,清華大學出版社出版——程序設計基礎(第二版)中的壹道例題。在這裏為了符合題意,進行了修改。
直言:壹樓說的有壹定的道理,參考別人的程序前最好還是要自己先寫寫出來,然後和別人的進行比較。如果對問題進行了詳細的分析但仍有困難,再去參考他人的程序。感覺這樣收獲或許會大些。我是這樣做的,呵呵!