
正文
约瑟夫环java代码讲解 约瑟夫环求解代码
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JAVA编程 15红球和15个绿球排成一圈
这是一个约瑟夫环问题,只不过是数到13时把球拿走,到剩下15个球为止.按照题意编写约瑟夫环java代码讲解的Java程序如下
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class AAA {
public static void main(String[] args) {
ListInteger l2=new ArrayListInteger();//存放被拿出约瑟夫环java代码讲解的红球的位置
ListInteger l=new ArrayListInteger();//存放最初30个球的位置
for(int i=1;i=30;i++){
l.add(i);
}
int point=0,number=1;
while(l.size()15){
if(number%13==0){
l2.add(l.get(point));
l.remove(point);
--point;
}
++point;
++number;
if(pointl.size()-1){
point=0;
}
}
System.out.println("被依次拿走的球的位置为"+l2.toString());
Collections.sort(l2);//对被依次拿走的球的位置排序
System.out.println("红球的位置为"+l2.toString());
}
}
运行结果
被依次拿走的球的位置为[13, 26, 9, 23, 7, 22, 8, 25, 12, 30, 18, 6, 29, 20, 15]
红球的位置为[6, 7, 8, 9, 12, 13, 15, 18, 20, 22, 23, 25, 26, 29, 30]
相关问答
Q1: 急!急!急!Java怎么用递归实现约瑟夫环?求试验成功的、初级的代码
public class TestJosephus {
public static void main(String[] args) {
//留几个人
int alive = 2;
//总人数
int total = 41;
//自杀者报数
int killMan = 3;
Josephus(alive, total, killMan);
}
/**
* @param alive 存活的人初始位置序号//留几个人
* @param total 总人数
* @param killMan 自杀者报数
*/
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) + " 个人自杀!约瑟夫环编号为:" + man[pos]);
if (count % 2 != 0) {
System.out.print(" - ");
}else {
System.out.println(" -= ");
}
count++;
}
System.out.println();
System.out.println("这 " + alive +" 个需要存活的人初始位置应排在以下序号:");
alive = total - alive;
for (i = 0; i total; i++) {
if (man[i] alive) {
System.out.println("初始编号:" + (i+1) + ",约瑟夫环编号:" + man[i]);
}
}
System.out.println();
}
}
Q2: 急求用java解决约瑟夫环的编程(接图片“显示“出环者”次序并给出最终的赦免者”)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数:");
int totalNum = scanner.nextInt();
System.out.print("请输入报数的大小:");
int cycleNum = scanner.nextInt();
System.out.print("请输入第几个报数:");
int cur = scanner.nextInt();
yuesefu(totalNum, cycleNum ,cur);
scanner.close();
}
public static void yuesefu(int totalNum, int countNum,int cur) {
// 初始化人数
ListInteger start = new ArrayListInteger();
for (int i = 1; i = totalNum; i++) {
start.add(i);
}
//从第K个开始计数
int k = cur-1;
while (start.size() 0) {
k = k + countNum;
//第m人的索引位置
k = k % (start.size()) - 1;
// 判断是否到队尾
if (k 0) {
System.out.println(start.get(start.size()-1));
start.remove(start.size() - 1);
k = 0;
} else {
System.out.println(start.get(k));
start.remove(k);
}
}
}
}
Q3: 用java在数组中实现约瑟夫环的问题, 要求写明详细注释, 方法最好简单一点, 初学者,
package ysfh;
/**
* 【约瑟夫环的问题】
* 有17个人(编号从1到16),按编号依次排列成一个圆环(编号16的接着编号为1 的人),从编号为1 的人开始报数,数到3的人退出圆环,如此循环,最后留下的那个人的编号是什么?
* 1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15,16
* 要求:请用面向对象的思想来处理这个问题并在下面写出具体的代码(可以选择你熟悉的语言,如java/C++/C#等)
* @author Administrator
*
*/
public class Ysfh {
public static void main(String[] args) {
m(3,16);
}
public static void m(int m,int n){
int c = 1;
int[] ns = ntoarray(n);
while(isone(ns) == false){//如果数组中有一个以上的数不为0
for (int i = 0; i ns.length; i++) {
if(ns[i] != 0 ){//等于0的都退出了 所以从所有不等于0的开始
if(c == m){//是第三个数 给他赋值0 并让计数器c从1 开始
ns[i] = 0 ;
c = 1;
}else{//否则继续计数器下一个
c++;
}
}
}
}
//循环输出最后留下的数字
for (int i = 0; i ns.length; i++) {
if(ns[i] != 0){//除0以外的数字 0代表删除
System.out.println(ns[i]);
}
}
}
/**
* 将 n 转换为数字 n=3 {1,2,3}
* @param n
* @return
*/
public static int[] ntoarray(int n){
int[] ns = new int[n];
for (int i = 0; i ns.length; i++) {
ns[i] = i + 1;
}
return ns;
}
/**
* 判断数组里是否只有一个数不为0
* @param ns
* @return
*/
public static boolean isone(int[] ns){
boolean isone = false;
for (int i = 0; i ns.length; i++) {
if(isone == false ns[i] != 0){
isone = true;
}else if(isone == true ns[i] != 0){
return false;
}
}
return isone;
}
}
Q4: 怎么用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;
}
}
}
}
Q5: 求解约瑟夫环问题(Java)
package 约瑟夫环;
import java.util.LinkedList;
import java.util.List;
/**
* 约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈 ,每人手持一个密码(正整数),
* 开始任意选一个整数作为报数上限值,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,
* 将他的密码作为新的m值,从他顺时针下一个人开始重新从1开始报数,
* 如此下去直到所有的人全部都出列为止。试设计程序实现,按照出列的顺序打印各人的编号。
* @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() {
// 初始化数据
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;//已经报了多少人
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();
}
}
跟这差不多的。
约瑟夫环java代码讲解的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于约瑟夫环求解代码、约瑟夫环java代码讲解的信息别忘了在本站进行查找喔。








