「java约瑟夫循环」java实现约瑟夫环问题
今天给各位分享java约瑟夫循环的知识,其中也会对java实现约瑟夫环问题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java循环单链表实现约瑟夫环,我的代码出列顺序不正确
- 2、怎么用java数组实现约瑟夫环
- 3、Java约瑟夫经典循环算法
- 4、java循环单链表实现约瑟夫环
- 5、java编程序实现约瑟夫环
- 6、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实现约瑟夫环问题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-15,除非注明,否则均为
原创文章,转载请注明出处。