當前位置:編程學習大全網 - 源碼下載 - 幫忙用C++或C編寫約瑟夫環的程序

幫忙用C++或C編寫約瑟夫環的程序

問題描述(約瑟夫環):

已知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;

}

}

說明:這是我以前看程序編程基礎時做的小練習。當時,代碼參考了吳文虎編著,清華大學出版社出版——程序設計基礎(第二版)中的壹道例題。在這裏為了符合題意,進行了修改。

直言:壹樓說的有壹定的道理,參考別人的程序前最好還是要自己先寫寫出來,然後和別人的進行比較。如果對問題進行了詳細的分析但仍有困難,再去參考他人的程序。感覺這樣收獲或許會大些。我是這樣做的,呵呵!

  • 上一篇:雲播是什麽意思
  • 下一篇:怎麽用月線選股方法選股
  • copyright 2024編程學習大全網