![]() ![]() |
|
Josephus问题的C++新解法 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:41:04 文章录入:杜斌 责任编辑:杜斌 | |
|
|
class Josephus { public: void OutControl(int num,int begin,int interval); protected: int num; int begin; int interval; }; List.h struct People { int number; People *next; }; class List { public: List (int num)//初始化point->number { josephus = new People[num]; point = josephus; for(int i=1;i<=num;i++) { point->number = i ; point->next = josephus + i % num; /*利用+1取模的方式设置节点的next指针, 当到最后的时候自动指向到第一个,形成环链 */ point = point->next; } point = &josephus[num-1]; //把起始指针设置在最后一个节点,当进入循环的时候就会从0开始, } ~List() { delete[] josephus; //返回堆内存空间 } void Change (int num, int begin); void Count(int interval); void Output(); void Show(); protected: People *josephus; People *point; People *cut_point; }; Josephus.cpp #include <iostream> #include "Josephus.h" #include "List.h" using namespace std; void Josephus::OutControl(int num,int begin,int interval) //调用List的成员函数,依次输出出列的号码 { List in(num); in.Change (num, begin); cout<<"依次出列次序为:"; for(int i=1;i<=num;i++) { in.Count(interval); in.Show(); in.Output(); } cout<<endl; } List.cpp #include <iostream> #include "List.h" using namespace std; void List::Change (int num, int begin) //设置起始指针的位置 { if (begin==1) point=&josephus[num-1]; if (begin>=2) point=&josephus[begin-2]; } void List::Count(int interval) //通过循环不断的寻找需要放弃的节点 { for(int i=0;i<interval;i++) { cut_point = point; point = cut_point->next; } } void List::Show() //打印号码 { cout<<point->number<<"."; } void List::Output() //使不需要的节点脱离 { cut_point->next = point->next; point=cut_point; } main.cpp #include <iostream> #include "Josephus.h" using namespace std; void main() { int num,begin,interval; cout<<"请输入总人数:"; cin>>num; if(num<2) { cout<<"错误!总人数不能小于2!"; return; } cout<<"请输入开始号码:"; cin>>begin; if(begin<1||begin>num) { cout<<"错误!开始号码不能小于1或大于总人数!"; return; } cout<<"请输入间隔:"; cin>>interval; if(interval<1||interval>num) { cout<<"错误!间隔不能小于1或大于总人数!"; return; } Josephus in; in.OutControl(num,begin,interval); cin.get (); cin.get (); } |
|
![]() ![]() |