问题描述:
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
实现代码:
输入输出头文件
#ifndef MYSTDINOUT_H
#define MYSTDINOUT_H
#include <QTextStream>
static QTextStream cin(stdin);
static QTextStream cout(stdout);
#endif // MYSTDINOUT_H
包含约瑟夫环类的头文件
#ifndef JOSEPH_H #define JOSEPH_H #include "mystdinout.h" #include <QTextStream> //建立Joseph节点的结构体 struct JosephNode { JosephNode * Next; int Pos; }; //约瑟夫环类 class JosephRing { public: void CreatJR(); void Jose(); private: JosephNode * JR;//存放链表头指针 }; //建立约瑟夫环,单向循环链表 void JosephRing:: CreatJR() { JosephNode * head,* s, * r; int Num; cout<<"please input the Num of JosephRing:"<<endl; cin>>Num; head = new JosephNode; r = head; for(int i = 1; i<=Num; i++) { s = new JosephNode; s ->Pos = i; r ->Next = s; r = s; } r ->Next = head ->Next;//构成循环链表 JR = head;//链表头指针赋给对象头指针 } //删除节点,从第s个开始报数,报到m出列 void JosephRing:: Jose() { int s,m; cout<<"please input the start Num"<<endl; cin>>s; cout<<"please input period Num "<<endl; cin>>m; JosephNode * p; p = JR ->Next; JosephNode * q; for(int i = 1; i<=s-1; i++)//找到开始报数的人 { q = p; p = p->Next; } while(p ->Next != p) { for(int j = 1; j<= m-1; j++)//找到报m的人,删除节点 { q = p; p = p->Next; } cout<<p->Pos<<" "; q->Next = p->Next;//删除节点 delete p; p = q->Next;//从下一个开始计数 } cout<<p->Pos<<endl; } #endif // JOSEPH_H
主函数
/******************************************************
*Project:JosephRing约瑟夫环问题
*Author:yujiao
*Date:2013.10.24
*Input:总人数Num,第一个计数位置s,计数周期m
*Output:被清出的顺序
******************************************************/
#include <QCoreApplication>
#include"Joseph.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
JosephRing MyJR;//初始化一个对象
MyJR.CreatJR();//输入总人数,建立循环链表
MyJR.Jose();//从第s个人开始计数,数到m的人被踢出
return a.exec();
}
运行结果演示