思路:使用队列模拟。

判断是否为出圈的数。如果不是,把数加入队列尾部;如果是,输出并删除。

题目背景

约瑟夫是一个无聊的人!!!

题目描述

n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.

输入输出格式

输入格式:

 

n m

 

输出格式:

 

出圈的编号

 

输入输出样例

输入样例#1: 复制

10 3

输出样例#1: 复制

3 6 9 2 7 1 8 5 10 4

说明

m, n \le 100m,n≤100

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int m=in.nextInt();
		Queue<Integer> q=new LinkedList<Integer>();
		for(int i=1;i<=n;i++)
			q.add(i);
		int k=0;
		while(q.size()>0)//判断队列中是否还有元素
		{
			if(++k%m==0)//报数到m,说明该数字需出圈
				System.out.print(q.remove()+" ");//输出删除该数
			else
				q.add(q.remove());//如果是非出圈数,将该数删除并加入队列尾部
		}
	}

}