Java练习题–约瑟夫问题
题目描述
N个人围成一圈,从第一个开始报数,第M个将被杀掉,再由下一个人开始重新报数,直到最后剩下一个人。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
输入格式
两个正整数N和M。
输出格式
剩下的最后一个人的编号。
样例输入
6 5
样例输出
1
提示/说明
N,M均小于10000
Java代码实现
import java.util.Scanner;
public class JosephProblem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int N = scanner.nextInt(); // N个人
int M = scanner.nextInt(); // 报数最大数
int lastOne = NumberOff(N, M);
System.out.println(lastOne);
}
}
public static int NumberOff(int N, int M){
// 赋予每个人编号
int[] arr = new int[N];
for(int i=0; i<N; i++){
arr[i] = i+1;
}
boolean judge1 = true;
int i = 1; // 报数
int j = 0; // 每个人的序号
int num = 0; // 记录最后一个人的编号
while(judge1){
boolean judge2 = true;
if(i > M){
i = 1;
}
if(j >= N){
j = 0;
}
// 计算被杀掉的人数
int count = 0;
for(int k=0;k<N;k++){
if(arr[k]==0){
count++;
// System.out.print("被淘汰的人:" + k + ",");
}else{
num = k;
}
}
// System.out.println("被淘汰的人数:"+count);
// 剩下最后一个人,跳出循环
if(count == N-1){
judge1 = false;
break;
}
// 报数
int l = j;
while(judge2){
if(l>=N){
l=0;
}
if(arr[l]!=0){
arr[l] = i;
// 被淘汰
if(arr[l] == M){
arr[l] = 0;
}
// System.out.println(l+"报数:"+arr[l]);
judge2 = false;
}
else{
l++;
}
}
i++;
j = l+1;
}
return num+1; // 返回最后一个人的编号
}
}