1. 程式人生 > >約瑟夫環問題(順序表)——C++實現

約瑟夫環問題(順序表)——C++實現

#include<iostream>
#include<malloc.h>
#define MAXSIZE 100//人數上限
using namespace std;

typedef int DataType;
typedef struct{
	DataType data[MAXSIZE];//存放編號的陣列
	int length; //人數
}SeqList,* PSeqList;

int main(){
	/*函式宣告*/
	void panduan(PSeqList L);
	PSeqList Init_SeqList(void);
	void Delete_SeqList(PSeqList L,int i);
	void josephus_SeqList(PSeqList L,int s,int m);

	PSeqList L=Init_SeqList();//建立環
	int s;//起始序號
	int m;//計數值
	cout<<"請輸入約瑟夫環的起始序號s和計數值m的值分別是:";
	cin>>s>>m;
	josephus_SeqList(L,s,m);//約瑟夫序列演算法

	return 0;

}

/*判斷順序表是否存在或溢位*/
void panduan(PSeqList L){
	if(!L){
		cout<<"表不存在!";
		return;
	}
	if(L->length>=MAXSIZE){
		cout<<"表溢位!";
		return;
	}
}

/*建立順序表*/
PSeqList Init_SeqList(void){
	PSeqList L;
	L=(PSeqList)malloc(sizeof(SeqList));
	cout<<"輸入約瑟夫環的人數(不超過100):";
	cin>>L->length;

	cout<<"輸入每個人的小名:";
	for(int i=0;i<L->length;i++){
		cin>>L->data[i];
	}

	return L;
}

/*刪除順序表第i個元素*/
void Delete_SeqList(PSeqList L,int i){
	panduan(L);
	if(i<1 || i>L->length+1){
		cout<<"刪除位置不合法!";
		return;
	}
	for(int j=(i-1);j<L->length;j++){
		L->data[j]=L->data[j+1];
	}
	L->length--;
}

/*約瑟夫序列演算法*/
void josephus_SeqList(PSeqList L,int s,int m){
	int j=1;
	panduan(L);

	int s1=s-1; //第s個人對應的陣列下標
	cout<<"\n\n輸出約瑟夫序列:\n\n";
	for(int i=L->length;i>0;i--){
		s1=(s1+m-1)%i;//出列人的下標
		cout<<"第"<<j++<<"個出列的人是:"<<L->data[s1]<<endl;
		Delete_SeqList(L,s1+1);//在陣列中刪除出列人
	}
}

相關推薦

-順序-C++

#include <iostream> using namespace std; template<class T> class SeqList { public: SeqList(int size=64); SeqList(T value[]

-順序實現

題目: 約瑟夫環的一種描述為 編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。 一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。 報m的人出列,將他的密碼作為新的m值,從他在

數組簡單實現

sys 進行 記錄 約瑟夫環 人的 out () live ava 約瑟夫環是一個很有意思的算法。大意就是:羅馬人占領了喬塔帕特,41個人藏在一個山洞中躲過了這場浩劫。這41個人中,包括歷史學家約瑟夫(Josephus)和他的一個朋友。剩余的31個人為了表示不想羅馬

——鏈

name display ace style int eof == using esp #include <iostream> #include <stdlib.h> using namespace std; typedef str

簡單模板(C++版)

hdu2211 #include <bits/stdc++.h> using namespace std; int t; long long n,k; //函式返回的就是勝利者編號 long long cir(long long n,long long m){ /

(使用C語言單向迴圈連結串列來解決)

題目描述 編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一 開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那 個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,

問題連結串列實現

問題描述:約瑟夫環問題是,編號為1,2,3,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼。開始時任選一個正整數作為報數上限值m,從第一個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報

問題的陣列實現

約瑟夫環問題的描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出圈

問題 java程式碼實現(高效率)

<pre name="code" class="java">//約瑟夫問題 package com.test; public class test { public static void main(String[] args) { CycLink cycLink= n

迴圈連結串列實現

 1 #include <stdio.h>  2 #include <stdlib.h>  3 //約瑟夫環的實現:一群人圍成一圈,這群人共有 n個人,每個人身上都一個key,依次給這圈人編號:  4 //1,2,n 一開始報數的上限值為m從第一個人(編號:1)自一開始報數報到m時停

問題(順序)——C++實現

#include<iostream> #include<malloc.h> #define MAXSIZE 100//人數上限 using namespace std; ty

遊戲->連結串列和順序實現

#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; typedef struct Staff { int number; struct Staff

C語言用陣列1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問實現約瑟夫環問題

1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問題: 報到T的人出圈,怎麼表示出圈?要麼刪除對應的標號,其他的標號前移(如果是陣列結構,要依次移動

C/C++,資料結構單鏈實現

約瑟夫環——圍成一圈,定義一個數值K,從任意位置開始計數,每走K步刪除當前位置結點,直到剩下最後一個結點,求最後一個結點//單鏈表結構以及Find函式參見 2016-1-2 13:56 發表部落格SLi

C++實現的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

C語言 單循

node 前驅 輸入 truct sizeof -- 描述 reat 約瑟夫 /*---------約瑟夫環---------*/ /*---------問題描述---------*/ /*編號為1,2,…,n的n個人圍坐一圈,每人持一個密碼(正整數)。 一開始

c語言實現(代碼已實現

def 數字 com max std urn img pri c語言實現 # include <stdio.h> #define MAXLEN 20 int front=MAXLEN-1;//隊列初始化 int rear=MAXLEN-1; enqu

c語言實現(程式碼已實現

# include <stdio.h>   #define MAXLEN 20   int front=MAXLEN-1;//佇列初始化 int rear=MAXLEN-1;   enqueue(int q[],int x) //入隊 {   rea

問題C++實現

題目就不說了,學過演算法或者看過一些程式設計思維故事的人應該都有了解這個經典的問題。這裡直接看程式碼和執行結果。 #include <bits/stdc++.h> using namespace std; int n,m; int main() { while(c

使用順序求解問題 (自定義順序

約瑟夫環(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人,就拉出來處決,然後再數d個,數到的人再處決……直到剩下的最後一個可赦免。當n=5,s=1,d=2,時: 第一步:定義一個順序表Se