約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最后剩下一個,其余人都將被殺掉。
比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最后剩下1號。
假定在圈子里前K個為好人,后K個為壞人。你的任務是確定這種最少M,使得全部的壞人在第一個好人之前被殺掉。
//----數學中有乘法口訣。
。那僅僅是工具。我們都非常熟悉。
//----C++中有一些主要的程序。也僅僅是工具。我們必須像熟悉乘法口訣一樣去熟悉這些程序。
//----非常基礎的一些東西,必須熟練。。。
#include<iostream> class link; using namespace std; class node{ friend class link; public: node():next(NULL){} node(int value):data(value),next(NULL){} private: int data; node *next; }; class link{ public: link(int x,int y,int z):n(x),s(y),m(z){} node *createlink() { node *p,*r; node *q; r=p=new node; for(int i=1;i<=n;++i) { q=new node; q->data=i; r->next=q; r=q; } r->next=p->next; return p; } node *jusefu(node *startnode) { node *p=startnode->next; node *q; for(int i=1;i<s;++i) p=p->next;//讓p指向開始數數的位置,讓q指向須要刪除結點的位置的前一個位置 q=p->next; while(q->next!=p) { q=q->next; } while(p->next!=p) { for(int j=1;j<m;++j) { //node *tmp; q=p; p=p->next; } q->next=p->next; cout<<"將要刪除的號碼是"<<p->data<<endl; delete p; p=q->next; } cout<<"留下來的人數的號碼為"<<p->data<<endl; return p; } private: int n; int s; int m; }; int main() { int i,j,k; cout<<"輸入總數,開始位置。每次循環人數"<<endl; cin>>i>>j>>k; link linklist(i,j,k); node *head=linklist.createlink(); node *lastnode=linklist.jusefu(head); system("pause"); return 0; }