用java數(shù)組實現(xiàn)約瑟夫環(huán)
十年專注成都網(wǎng)站制作,成都定制網(wǎng)頁設(shè)計,個人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設(shè)計流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)頁設(shè)計,高端網(wǎng)頁制作,對花箱等多個行業(yè),擁有豐富的網(wǎng)站推廣經(jīng)驗。
package?Josephround;
public?class?Joseround?{
int?sit;
int?flagjo=0;
Joseround(){};
Joseround(int?x){
sit=x;
}
void?setflag(int?x){
flagjo=x;
}
}
package?Josephround;
public?class?Inijose?{
Joseround?jo[];
static?int?length=0;
Inijose(){};
Inijose(int?x){
jo=new?Joseround[x];
for(int?i=0;ix;i++){
jo[i]=new?Joseround(i+1);//創(chuàng)建對象數(shù)組
length++;
}
}
void?delete(int?n){
for(int?i=n;ilength-1;i++){
jo[i]=jo[i+1];
}
length--;
}
}
package?Josephround;
import?java.util.Scanner;
public?class?Text?{
public?static?void?main(String[]?args)?{
int?m,n;
System.out.println("input?m");
Scanner?m1=new?Scanner(System.in);
m=m1.nextInt();
System.out.println("input?n");
Scanner?n1=new?Scanner(System.in);
n=n1.nextInt();
int?temp=0;
int?x=0;
Inijose?joseph=new?Inijose(n);
while(joseph.length!=0){
for(int?i=1;i=m;i++){
joseph.jo[x].setflag(i);
if(joseph.jo[x].flagjo==m){
System.out.println(joseph.jo[x].sit);
joseph.delete(x);
x--;
}
if(xjoseph.length-1)?x++;
else?x=0;
}
}
}
}
public?class?TestJosephus?{
public?static?void?main(String[]?args)?{
//留幾個人
int?alive?=?2;
//總?cè)藬?shù)
int?total?=?41;
//自殺者報數(shù)
int?killMan?=?3;
Josephus(alive,?total,?killMan);
}
/**
?*?@param?alive?存活的人初始位置序號//留幾個人
?*?@param?total?總?cè)藬?shù)
?*?@param?killMan?自殺者報數(shù)
?*/
public?static?void?Josephus(int?alive,?int?total,?int?killMan)?{
int?[]man?=?new?int[total];
int?count?=?1;
int?i?=?0;
int?pos?=?-1;
while?(count?=?total)?{
do?{
pos?=?(pos+1)%total;
if?(man[pos]?==?0)?{
i++;
}
if?(i?==?killMan)?{
i?=?0;
break;
}
}?while?(true);
man[pos]?=?count;
System.out.print("第?"?+?(pos+1)?+?"?個人自殺!約瑟夫環(huán)編號為:"?+?man[pos]);
if?(count?%?2?!=?0)?{
System.out.print("?-?");
}else?{
System.out.println("?-=?");
}
count++;
}
System.out.println();
System.out.println("這?"?+?alive?+"?個需要存活的人初始位置應(yīng)排在以下序號:");
alive?=?total?-?alive;
for?(i?=?0;?i??total;?i++)?{
if?(man[i]??alive)?{
System.out.println("初始編號:"?+?(i+1)?+?",約瑟夫環(huán)編號:"?+?man[i]);
}
}
System.out.println();
}
}
package 約瑟夫環(huán);
import java.util.LinkedList;
import java.util.List;
/**
* 約瑟夫環(huán)問題的一種描述是:編號為1.2.3…….n的n個人按順時針方向圍坐一圈 ,每人手持一個密碼(正整數(shù)),
* 開始任意選一個整數(shù)作為報數(shù)上限值,從第一個人開始順時針自1開始順序報數(shù),報到m時停止報數(shù)。報m的人出列,
* 將他的密碼作為新的m值,從他順時針下一個人開始重新從1開始報數(shù),
* 如此下去直到所有的人全部都出列為止。試設(shè)計程序?qū)崿F(xiàn),按照出列的順序打印各人的編號。
* @author Administrator
*
*/
public class Question2 {
class person {
int password;
int number;
int state = 1;
public person(int password, int number) {
this.password = password;
this.number = number;
}
public person(int number){
this.number = number;
}
}
public int ListLength(Listperson list) {
int count = 0;
if (list != null) {
for (person p : list) {
if (p.state != 0) {
count++;
}
}
}
return count;
}
public void cacle() {
// 初始化數(shù)據(jù)
Listperson list = new LinkedListperson();
list.add(new person(3,1));
list.add(new person(1,2));
list.add(new person(7,3));
list.add(new person(2,4));
list.add(new person(4,5));
list.add(new person(8,6));
list.add(new person(4,7));
int position = -1;//初始位置
int m = 20; //第一次報多少的人出來
int count = 0;//已經(jīng)報了多少人
while (ListLength(list) != 0) {
position = (position + 1) % list.size();// 位置定位
if (((person) list.get(position)).state != 0) {
count++;
}
if (count == m) {
person p = list.get(position);
System.out.print(p.number+" ");
p.state = 0;
m = p.password;
list.set(position, p);
count = 0;
}
}
}
public static void main(String[] args) {
Question2 q= new Question2();
q.cacle();
}
}
跟這差不多的。
首先,這個代碼輸出的是,約瑟夫環(huán)到達的最后位置。輸出結(jié)果是15。
//把iostream這個文件中的內(nèi)容復(fù)制到這個地方。
#includeiostream
using namespace std;
int main()
{
//定義一個常量的整形100,表示人的個數(shù)。
const int n=100;
//定義約瑟夫環(huán)的參數(shù)。
int m=30;
//定義一個數(shù)組,用于計算約瑟夫環(huán)的位置。
int a[n];
//給數(shù)組賦值,讓數(shù)組的每個值就是這個元素的編號。
for(int j=0;jn;j++)
a[j]=j+1;
//定義一個標志k,當K等于N的時候,表示到達約瑟夫環(huán)的最后位置。
int k=1;
int i=-1;
while(1)
{
for(int j=0;jm;)
{
//不停的取數(shù)組的下一個元素。
i=(i+1)%n;
//如果這個元素沒有被標記為0,說明這個位置還沒有被排除,j加1,進入下一個循環(huán)
if(a[i]!=0)
j++;
}
//如果標志K等于n,說明約瑟夫環(huán)的循環(huán)到達最后一個位置,跳出While死循環(huán)。
if(k==n)
break;
//否則,把這個位置的元素設(shè)為零,標志它被排除。
a[i]=0;
//標志+1。
k++;
}
//輸出約瑟夫環(huán)到達的最后一個位置。
couta[i]endl;
return 0;
}