//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //ring.h //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct Node { int code; Node *next; }; class Ring { public: Ring(int n); ~Ring(); void Progress(int m); void PrintNode(); int GetCode(); void DeleteNode(); protected: Node *head; Node *pivot; Node *pCur; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //ring.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #include #include "ring.h" Ring::Ring(int n) { head = new Node[n]; pCur = head; for (int i=1; i<=n; i++,pCur=pCur->next) { pCur -> code = i; pCur -> next = head + (i % n); // PrintNode();//if you want to look the boy who was you input,you can live out "//" } cout << endl; pCur = &head[n-1]; } Ring::~Ring() { delete []head; } void Ring::Progress(int m) { for (int i=0; i { pivot = pCur; pCur = pCur -> next; } } void Ring::PrintNode() { static int lineCount; if (((lineCount++) % 10) == 0) cout< cout << setw(4) << pCur -> code; } int Ring::GetCode() { return pCur -> code; } void Ring::DeleteNode() { pivot -> next = pCur ->next; pCur = pivot; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //jose.h //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Jose { public: Jose(int boys, int begin, int m); Jose(); int GetWinner(); protected: int numOfBoys; int beginPos; int interval; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Jose.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #include "ring.h" #include "Jose.h" Jose::Jose(int boys , int begin, int m) { if (boys < 1) { cout << "Bad number of boys!/n"; return; } if (begin < 0) { cout << "Bad beginning position!/n"; return; } if ((m<1) || (m>boys)) { cout << "Bad interval number!/n"; return; } numOfBoys = boys; beginPos = begin; interval = m; } Jose::Jose() { int boys,begin,m; cout << "Please input the number of boys.Then input the number which you want to begin count.The thirth number is interval per count: /n"; cin >> boys >> begin >> m; if (boys < 1) { cout << "Bad number of boys!May be,the number is too small!/n"; return; } if (begin < 0) { cout << "The value of the begain number must more than 1./n"; return; } if ((m<1) || (m>boys)) { cout << "Interval number is between 1 and number of boys"; return; } numOfBoys = boys; beginPos = begin; interval = m; } int Jose::GetWinner() { Ring x(numOfBoys); x.Progress(beginPos-1); for (int i=1; i { x.Progress(interval); //x.PrintNode(); //if you want to look the boy who is out,you can live out "//" x.DeleteNode(); } return x.GetCode(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //start.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include "Jose.h" int start(int num, int winner, int interval) { Jose j(num,1,interval); return (num+(1+(winner-j.GetWinner()))%num); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //main.cpp //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #include "Jose.h" int start(int num, int winner, int interval); main() { int num,win,inte,i; cout << "Please input three numbers.The frist number is count childen;The second number is the number which you want to win;And third number is interval number." < cin >> num >> win >>inte; i=start(num, win, inte); cout < << "We must start count from number" << i <<"!" < cout <<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" < <<"Please input (Y)if you want to chack you answer;Else put (N):"; while(1) { char chack; cin>>chack; if(chack=='Y'||chack=='y') { Jose jose; cout << "/nThe winner is " << jose.GetWinner(); break; } else if(chack=='N'||chack=='n') break; } } |