约瑟夫环 java实现

问题:

N个人从1到N编号,围城一圈,从1开始报数, 数到X时,将X的编号输出,并将那个人踢出,

下一个从1再开始报数,直到所有人都出去

思路:

就是计数,移除,没有太深的思想,直接上代码:

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * N个人从1到N编号,围城一圈,
 * 从1开始报数, 数到X时,将X的编号输出,并将那个人踢出,
 * 下一个从1再开始报数,直到所有人都出去
 * @author anjl
 *
 */
public class My_JosephCircle {

	public static void main(String[] args) {
		List alist = new ArrayList();

		System.out.println("请输入约瑟夫环  中 总个数数:");
		Scanner sca = new Scanner(System.in);
		int N = sca.nextInt();
		// 提示输入要出圈的数值
		System.out.println("请输入要出圈的数值:");
		int X = sca.nextInt();
		System.out.println("按出圈的次序输出序号:");

		for(int i=0 ;i<N;i++){
			alist.add(i+1);
		}

		int i=-1;
		int countX=0;
		while(alist.size()!=0){
			++i;
			if(i== alist.size()){
				i=0;
			}
			++countX;
			if(countX==X){//输出
				System.out.print(alist.get(i)+ " ");
				alist.remove(i);
				countX=0;
				i--;//修正
			}
		}

	}
}

测试结果:

约瑟夫环 java实现,码迷,mamicode.com

时间: 2024-10-15 19:19:12

约瑟夫环 java实现的相关文章

j使用数组实现约瑟夫环 java

我们首先来看一下约瑟夫环问题: 给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号. 思路: 建立一个长度为m+1的数组,将其的内容初始化为0至m 我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利. 变量j为判断当前元素是否为排列的第n个元素,如果是则将当前下标为i的元素的值置为0,不是的话,i++,j++,每当我们遍历到数值为0的

约瑟夫环 java 对象数组实现

import java.util.Scanner; class Person{ String name; int seqno; Person(String _name, int _seqno){ name = _name; seqno = _seqno; } } public class JosephCircle { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanne

约瑟夫环问题-Java数组解决

约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. 1 class JosephLoop 2 { //n为环中人数,m为每次报数的人数,k为报数的起始位置0-n 3 int n,m,k; 4 int[] persons; 5 int[] seq; 6 7 JosephLoop(int n, int k, int m){ 8 this.n = n; 9 thi

约瑟夫环的java解决

总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需求:n个人围成一圈,从第一个人开始报数,数到K的人出局,然后从下一个人接着报数,直到最后一个人,求最后一个人的编号 * @author Miao * */public class Josephus { public static void main(String[] args) { int n =

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

约瑟夫环 --- 面向对象 --- java代码

约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 如有疑问请参考:http://blog.fishc.com

Java学习之约瑟夫环的两中处理方法

1 package day_2; 2 3 import java.util.Scanner; 4 5 /** 6 * @author Administrator 7 * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围坐一圈,约定编号为k(1<=k<=n) 8 * 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次 9 * 类推,直到所有人出列为止,由此产生一个出队编号的序列. 10 * 方法一:数组取模法.(模拟) 11 */ 12 13 p

剑指Offer解题报告(Java版)——约瑟夫环 45

? ? 引言 ? ? 常见的约瑟夫环问题有用循环链表做的,有用数组做的,这里提供一个用数学公式做的,由此可见,很多计算机的问题如果最终用到数学的知识,时间复杂度会大大的降低 ? ? 分析问题 ? ? 首先我们对0到n-1删除第一个数进行分析,第一个被删除的数一定是序号为m-1的数,因为0号数了1,1号数了2,m-1号数了m,那么应该删掉m-1号,设m-1号是第k号,这里这样做是因为后面可以扩展,想扩展为m-1%n=k ? ? 剩下的数按照序列重排序如下 ? ? 因为删掉的是k,那么下面第一个就是

Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列. 提示: 用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法