「java约瑟夫循环」java实现约瑟夫环问题

博主:adminadmin 2022-12-15 02:42:08 67

今天给各位分享java约瑟夫循环的知识,其中也会对java实现约瑟夫环问题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java循环单链表实现约瑟夫环,我的代码出列顺序不正确

你的remove方法不对,你的方法每次删掉的是从head开始第m个位置的节点,

但约瑟夫环需要的是要删掉每次循环数到m的位置的节点。

remove方法可以去掉,再把out方法改一下就可以了。

public void out(int m) throws Exception {

Node p = head;

Node pre = null;

int count = 1;

while (curlen 0) {

if (count == m) {

System.out.print(p.getData() + " ");

if(pre != null){

pre.setNext(p.getNext());

}

p = p.getNext();

curlen = curlen - 1;

count = 1;

} else {

pre = p;

p = p.getNext();

count++;

}

}

}

怎么用java数组实现约瑟夫环

用java数组实现约瑟夫环

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);//创建对象数组

            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;

            }

        }

         

    }

 

}

Java约瑟夫经典循环算法

下面是我用c#写的,其实原理都一样,楼主自己研究下吧

Console.WriteLine("请输入参与游戏的人数:");

int numPerson = int.Parse(Console.ReadLine());

Console.WriteLine("请输入游戏退出的规则数:");

int ruleNum = int.Parse(Console.ReadLine());

bool[] person = new bool[numPerson]; //定义每个人是否退出开关,默认为否

int callNum = 0; //报数

int total = 0; //记录已经退出的人数

int index = -1; //报数的循环游标

while (true) {

index++; //从第一个人开始

index %= numPerson; //确保数组不越界,当游标指向最后一个数组元素以后,从头开始

if (!person[index]) { //第index个人没有退出时,则进行报数

callNum++;

}

if (callNum == ruleNum) { //当第index个人报数的数字与规则数相同时,则开关打开,退出报数

person[index] = true;

total++; //退出的总人数更新

callNum = 0; //为下一个人报数更新数据

Console.WriteLine("玩家{0}退出",index+1);

}

if ((numPerson - total) == 1) { //当游戏玩家只剩下一个的时候结束游戏

for (int i = 0; i person.Length; i++) {

if (person[i] == false) { // 判断退出开关依然是否的玩家

Console.WriteLine("最后剩下的玩家是第:{0}位",i + 1); //输出实际的玩家号

break;

}

}

break;

}

}

java循环单链表实现约瑟夫环

看了你的代码,不是很明白,给你提几个建议吧:

1、不需要tail节点

2、remove方法应该对删除节点前面的节点操作,而不是使用数字找

给你我修改的LinkList类,你参考一下:

public class LinkList {

private Node head;

int curlen = 0;

// 创建链表

public void createlist(int code) throws Exception {

insert(curlen, code);

}

public void insert(int i, int code) throws Exception {

Node s = new Node(code);

if (i == 0) {

s.setNext(head);

head = s;

}

Node p = head;

int j = 0;

while (p != null  j  i - 1) {

p = p.getNext();

j++;

}

if (j  i || p == null) {

throw new Exception("插入位置不合理");

}

s.setNext(p.getNext());

p.setNext(s);

// tail = s;

// tail.setNext(head);

curlen = curlen + 1;

}

public void remove(int i) throws Exception {

Node p = head, q = null;

int j = 0;

i = i - 1;

while (j  i) {

q = p;

p = p.getNext();

j++;

}

if (j  i || p == null)

throw new Exception("删除位置不合法");

if (q == null) {

// tail.setNext(p.getNext());

head = head.getNext();

} else

q.setNext(p.getNext());

curlen = curlen - 1;

}

/**

 * 按照节点删除

 * @param i

 * @throws Exception

 */

public void remove(Node p) throws Exception {

if(p.getNext()==p){

p=null;

head=null;

}

else{

Node q = p.getNext();

p.setNext(q.getNext());

}

curlen = curlen - 1;

}

public void out(int m) throws Exception {

Node p = head;

if(m==1){

System.out.print("按照顺序出列");

return;

}

int count = 1;

int n=m-1;

while (curlen  0) {

if (count == n) {

System.out.print(p.getNext().getData() + "  ");

remove(p);

count = 1;

} else {

count++;

}

p = p.getNext();

}

}

public void display() {

Node node = head;

for (int i = 0; i  2 * curlen; i++) {

System.out.print(node.getData() + " ");

node = node.getNext();

}

System.out.println();

}

}

java编程序实现约瑟夫环

精简易懂版本 刚写的

public class Yuesefu {

// 数三退一 约瑟夫环 求最后留在环中小朋友的位置 即原来的编号(1-500)

/**

* 初始化数组,添加标号

*/

private void markID(int[] child) {

for (int i = 0; i = child.length - 1; i++) {

child[i] = i + 1;

}

}

/**

* 求出小孩子原来的位置在什么地方,从一开始

*/

public void re_index(int[] i) {

for (int ii : i) {

if (ii 0) {

System.out.println("还在场内的小朋友的序号为 : " + ii);

}

}

}

/**

* 统计剩余的同学

*/

public int record(int[] re) {

int reco = 0;

for (int i : re) {

if (i 0) {

reco = reco + 1;

} else {

continue;

}

}

// System.out.println("目前还剩下:" + reco + " 个小朋友在圈圈里面");

System.out.println("程序努力加载计算中.............................................................................................." + reco);

return reco;

}

public static void run() {

int childs[] = new int[500];

Yuesefu yuesefu = new Yuesefu();

yuesefu.markID(childs);

yuesefu.startGame(childs);

yuesefu.re_index(childs);

}

/**

* 游戏开始

*/

private void startGame(int[] i) {

int index = 0; // 用作循环

int leave = 0; // 用作离场

while (true) {

if (i[index] != 0) {// 还在场内

leave = leave + 1; // 报数

if (leave == 3) {// 判断是否需要离场 需要

i[index] = 0; // 离场

leave = 0;// 重新报数

}

index = index + 1;// 下一个人预备

if (index == i.length) {// 已经到最后了 需重新循环

index = 0;

}

} else {// 不在场内

if (index == i.length - 1) {// 判断此出场的人是否为最后一个人

index = 0;

}

index = index + 1;// 跳过

}

int x = new Yuesefu().record(i);// 统计剩余人数

if (x == 1)

break;

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

run();

}

}

java 约瑟夫环 循环

import java.util.*;

public class Sefu {

public static void main(String[] args) {

int N;// 总人数

int M;// 从第M个人开始

int S;// 隔S个人出局

Scanner reader = new Scanner(System.in);

System.out.print("请输入N:");

N = reader.nextInt();

System.out.print("请输入M:");

M = reader.nextInt();

System.out.print("请输入S:");

S = reader.nextInt();

int[] a = new int[N];

for (int h = 1; h = N; h++) {

a[h - 1] = h;

System.out.print(a[h - 1] + " ");

}

System.out.println();

int count;

M = M - 1;// 转成下标

for (int j = 1; j = N; j++) {

count = 1;// 从1开始报数

while (count != S) {// 如果没有报到S就继续报数

if (a[M] != 0) {// 如果没出局就报数

count++;//报数

for (int i = 1; i  N; i++) {

//然后找下一个(从+1开始找)要报数的人

if (M + i  N) {

//如果M+i没到最后一位

if (a[M + i] != 0) {

//判断是否出局

M = M + i;

//没出局就是从这个人开始了

break;

//不要找了

}else{

continue;

//出局了就i++,看下一个人有没有出局

}

}else{

if (a[M + i-N] != 0) {

//如果M+i过了最后一位,就-N,相当于转了一个圈回到前面

M = M + i-N;

//没出局就从M+i-N开始报数

break;

}else{

continue;

}

}

}

} else {// 如果出局了就跳过找下一个要报数的人

if (M + 1  N) {

M++;

} else {

M = 0;

// 如果M+1==N就从下标0开始找数组的值不是0的数

continue;

}

continue;// 如果是0就继续

}

}

// 如果报数报到S

System.out.print(a[M] + " ");// 出局

int out=M;//下标为out的出局了

for (int i = 0; i  N; i++) {//找下一个要报数的人

if (M + i  N) {//如果M+i没到最后一位

if (a[M + i] != 0) {//判断是否出局

M = M + i;

break;

}else{

continue;//出局了就i++从下一个开始

}

}else{

if (a[M + i-N] != 0) {

//如果M+i过了最后一位,就-N,相当于转了一个圈回到前面

M = M + i-N;

break;

}else{

continue;

}

}

}

a[out]=0;//出局的设为0

}

}

}

//写完发现我定义的S和M和你定义的是反过来的,不是最好的算法。

//可以把找下一个人的方法抽出来,写成一个方法

//输入一个数组a,找第M个人的下一个人,输出下一个人的下标。

import java.util.*;

public class Sefu {

public static void main(String[] args) {

int N;// 总人数

int M;// 从第M个人开始

int S;// 隔S个人出局

Scanner reader = new Scanner(System.in);

System.out.print("请输入N:");

N = reader.nextInt();

System.out.print("请输入M:");

M = reader.nextInt();

System.out.print("请输入S:");

S = reader.nextInt();

int[] a = new int[N];

for (int h = 1; h = N; h++) {

a[h - 1] = h;

System.out.print(a[h - 1] + " ");

}

System.out.println();

int count;

M = M - 1;// 转成下标

for (int j = 1; j = N; j++) {

count = 1;// 从1开始报数

while (count != S) {

// 如果没有报到S就继续报数

count++;// 报数

M=getNext(a, M);

//找下一个没出局(不为0)的数

}

// 如果报数报到S

System.out.print(a[M] + " ");// 出局

a[M]=0;

M=getNext(a, M);//找下一个没出局的数

}

}

/**

 * 得到下一个数的下标

 * @param a

 * @param M

 * @return

 */

public static int getNext(int[] a, int M) {

for (int i = 1; i  a.length; i++) {

if (M + i  a.length) {

if (a[M + i] == 0) {

//如果下一个数的值为0就继续找

continue;

} else {

M=M+i;

return M;

//如果下一个数的值不为0就是这个数。

}

}else{

if (a[M + i-a.length] == 0) {

//如果下一个数的值为0就继续找

continue;

} else {

M=M+i-a.length;

return M;

//如果下一个数的值不为0就是这个数。

}

}

}

return -1;

}

}

//一不小心又帮你改好了~

关于java约瑟夫循环和java实现约瑟夫环问题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-15,除非注明,否则均为首码项目网原创文章,转载请注明出处。