约瑟夫环问题

原创 2016年08月28日 16:20:21

约瑟夫环:已知n个人围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下个人又从1开始报数,数到m的那个人又出列;依此类推,直到全部人都出列。


解法:设从共有n个人,从第k个人开始报数,报数值为m
因为常规计数由1开始,开始报数人被计算两次所以需-1;
k-1+m为形成一个循环所需人数,与n求余值,即可知走一个循环所需圈数,
如果恰好一圈,则k值需置为0;若否则直接计数。


package com.test1;
import java.util.List;
import java.util.ArrayList;

/**
 * question:(约瑟夫环)已知n个人围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下个人又从1开始报数,数到m的那个人又出列;依此类推,直到全部人都出列。
 * 
 * @author Percy
 *
 */

public class Josephu {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int totalNum = 8;	//总人数
		int cycleNum = 2;	//报数大小
		int startNum = 1;	//从第几个开始计数
		
		yuesefu(totalNum,cycleNum,startNum);
	}

	public static void yuesefu(int totalNum,int countNum,int startNum){
		
		//countNum = countNum -1;
		//初始化人数
		 List<Integer> start = new ArrayList<Integer>();
		 
		 for(int i=1;i<=totalNum;i++){
			 start.add(i);
		 }
		 
		 //数到数人与开始报数人为同一个人,所以需要去除他本身
		 int k = startNum - 1 ;
		 
		 while(start.size()>1){
			 k = k +countNum ;
			 System.out.print("开始计数号+计数值:"+k +",");
			 System.out.print("圈内总人数:"+start.size() +",");
			 //第m人的索引位置
			 System.out.print("圈内人数是否够数(求余):"+k%(start.size()) +",");
			 k = k%(start.size())-1;
			 System.out.println("索引位置k:"+k +",");  
			
			 //判断是否到队尾
			 if(k < 0){
				//因为集合下标是从0开始是所以需要减1
				 System.out.println("出圈人(k<0):"+start.get(start.size()-1));   
				 start.remove(start.size()-1);
				 k = 0; 
			 }else {
					 
				 System.out.println("出圈人:"+start.get(k));
				 start.remove(k);
			 }
			 
			 if(start.size() == 1) {
				 System.out.println("最后留下的人:"+start.get(0));
			 }
		 }
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++经典题目:约瑟夫环问题

问题描述: 有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。 分析: 首先由用户输入人数n,然后对这n个人进行编号【因为如果不编号的话...
  • QianShouYuZhiBo
  • QianShouYuZhiBo
  • 2013年09月26日 23:48
  • 2988

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017年03月05日 14:48
  • 4315

C语言经典算法100例-069-简单约瑟夫环问题

这里我们实现一个简单的约瑟夫环问题,描述如下: 有N个人站成一圈,从
  • mrbourne
  • mrbourne
  • 2014年05月07日 09:24
  • 1443

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1030

约瑟夫环问题

描述了约瑟夫问题的两种解法。一种模拟过程,一种用数学方法推导。
  • KangRoger
  • KangRoger
  • 2014年09月13日 21:11
  • 45279

数据结构:约瑟夫环问题

约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如...
  • HMYANG314
  • HMYANG314
  • 2014年09月23日 12:47
  • 1886

约瑟夫环(数学高效率解法,很详细)

 5.5.4 用数学方法解约瑟夫环(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用数学方法解约瑟夫环(1...
  • qq_25973267
  • qq_25973267
  • 2015年12月25日 22:49
  • 4631

动态规划解决约瑟夫环问题

题目: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号0,1,2,3…n-1分别表示)围坐在一张圆桌周围。从编号为0的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到...
  • K346K346
  • K346K346
  • 2016年03月28日 10:09
  • 2097

详细阐述约瑟夫环问题(报数出队问题)

约瑟夫环问题(Josephus)       用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus) 直接上代...
  • Double2hao
  • Double2hao
  • 2015年10月05日 16:51
  • 1635

两种方法实现约瑟夫环(链表,顺序表)

//两种方法解决约瑟夫问题:顺序存储结构,循环单链表, //测试数据:a,b,c,d,e,f,g,h,i,j,n=10;从第2个开始,数到5即:s=2,m=5 //结果f,a,g,c,j,i,b,e,...
  • TFLiu666
  • TFLiu666
  • 2017年03月27日 20:58
  • 478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环问题
举报原因:
原因补充:

(最多只允许输入30个字)