码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫问题

时间:2015-05-06 22:53:39      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有n个人,编号为1,2,..., n,站成一圈,

 每次第m个将会被处决,直到只剩下一个人。约瑟夫通过给出m来决定赦免其中的一个人。
 例如当n=6,m=5时,5,4,6,2,3将会被依次处决,而1将会幸免。

 假如有k个好人,和k个坏人,所有人站成一圈,前k个人是好人,后k个人是坏人,
 编写程序计算一个最小的m,使k个坏人都被处决,而不处决任何好人。

     
 输入: k 为正整数
     
 输出: 
      
 返回: 最小的m,使k个坏人都被处决,而不处决任何好人。

 

package huawei;


public final class Demo {
	
	/*
	功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有n个人,编号为1,2,..., n,站成一圈,
	每次第m个将会被处决,直到只剩下一个人。约瑟夫通过给出m来决定赦免其中的一个人。
	例如当n=6,m=5时,5,4,6,2,3将会被依次处决,而1将会幸免。

	假如有k个好人,和k个坏人,所有人站成一圈,前k个人是好人,后k个人是坏人,
	编写程序计算一个最小的m,使k个坏人都被处决,而不处决任何好人。

	    
	输入: k 为正整数
	    
	输出: 
	     
	返回: 最小的m,使k个坏人都被处决,而不处决任何好人。
	     
	*/
	

	public static  int getMinimumM(int K)
	{
	    /*在这里实现功能*/
		int result=1;
		while(true)
		{
			boolean findMin=true;
			for(int i=0;i<K;i++)
			{
				int temp=GetInitNum(result, 2*K-i, i);
				if(temp<K)
				{
					findMin=false;
					break;
				}
			}
			if(findMin)
				break;
			result++;
		}
		return result;
	}

	//m:给定的报的数  n:剩余人数  order:第几个淘汰的人
	public static int GetInitNum(int m,int n,int order)
	{
		int tempN=n;
		int result=(m-1)%n;
		while((order--)>0)
		{
			tempN++;
			result=(result+m%tempN)%tempN;
		}
		return result;
	}
	
}

约瑟夫问题

标签:

原文地址:http://www.cnblogs.com/wuyuankun/p/4483381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!