功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有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; } }
时间: 2024-11-05 13:42:27