P1996 约瑟夫问题
题目描述
个人围成一圈,从第一个人开始报数,数到
的人出列,再由下一个人重新从
开始报数,数到
的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 。
输出格式
输出一行 个整数,按顺序输出每个出圈人的编号。
输入输出样例 #1
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
说明/提示
思路
先分析样例输入10 3,就是说10个小朋友轮流报数,输出报到3的人的编号,所以要先给小朋友编号1,2,3,4,5,6,7,8,9,10(初始队列),每个数字代表一个小朋友,再用一个变量res表示每个小朋友喊道的数字,编号1喊1,喊完不对去队尾,编号2喊2,喊完不对去队尾,编号3喊3,编号3对了出列,可以直接输出,或用一个数组记录最后统一输出,此时编号4就成为了队头,再从1喊起4,5,6,7,8,9,10,1,2(现在的队列),直至全部出列(队列为空)。
代码实现
package LAN;
import java.util.*;
public class duiliedemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue<Integer> q = new LinkedList<>();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int res = 0;
for(int i=1;i<=n;i++) {
q.add(i);
}
while(!q.isEmpty()) {
res++;
if(res == m) {
System.out.print(q.poll() + " ");
res = 0;
}
else q.add(q.poll());
}
}
}