zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有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;
    	}
    	
    }
  • 相关阅读:
    053403
    053402
    053401
    053400
    053399
    053398
    053397
    053396
    053395
    第k小数
  • 原文地址:https://www.cnblogs.com/wuyuankun/p/4483381.html
Copyright © 2011-2022 走看看