程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++求約瑟夫環問題

C++求約瑟夫環問題

編輯:關於C語言
 

C++編程求Josephus(約瑟夫環)問題:m個小孩子圍成一圈,從第一個小孩子開始順時針方向數數字,到第n個小孩子離開,這樣反反復復,最終只剩下一個小孩子,求第幾個小孩子留下?

//用C++鏈表,次鏈表是單向循環鏈表,方便操作

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <windows.h>
using namespace std;
/////////////////////////////////////////////////////////////////
class ys//定義類
{

int s;
public:
ys *next;
friend ys *set(int n);
void get(ys *s);
void putout(ys *t,int m,int n);
};
/////////////////////////////////////////////////
ys *set(int n)//初始化鏈表
{
ys *q=new ys,*h=q;
int i;
for( i=1;i<n;i++)
{
q->s=i;
q->next=new ys;
q=q->next;
}
q->next=h;
q->s=i;
return q;
}
/////////////////////////////////////////////////////////
void ys::get(ys *s)//輸出所有的小孩
{
int tem=s->s;
while(s->next->s!=tem)
{
cout<<s->next->s<<'\t';
s=s->next;
}
// cout<<s->s<<endl;
}
///////////////////////////////////////////////////////////////
void ys::putout(ys *t,int m,int n)//輸出剩下的一個小孩
{
//cout<<"指針:"<<t->s<<endl;
ys *h=t->next,*p=t;
int i=0;
for(;n>1;)
{
i++;
if(i%m!=0)
{p=h;h=h->next;}
else
{p->next=h->next;delete h;h=p->next;n--;}
}
cout<<endl<<"n:"<<h->s<<endl;
}

/////////////////////////////////////////////////////////////////
int main()
{
cout<<"請輸入n個小孩,間隔為m:\n";
int n,m;
cin>>n>>m;
ys yue;
ys *head;
head=set(n);
yue.get(head);
yue.putout(head,m,n);
return 0;
}
///////////////////////////////////////////////////////////////////

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved