小朋友报数

描述: 

有若干小朋友,站成一个圈;老师要求从第一个小朋友开始从1开始报数,报到指定数X的小朋友出圈,剩下的小朋友从出圈的小朋友的下一个开始继续报数;直到圈子中的所有小朋友都出圈为止。

现假设输入小朋友的名字和报的数X,输出小朋友出圈的顺序;

例如:


输入:
Marry,Jimmy,Tom,Susan,Liming,WangWu,Chen,Qian,3
输出:
Tom,WangWu,Marry,Liming,Jimmy,Qian,Susan,Chen

注:
1、不考虑输入名字有其它字符(仅相连的英文字母),不考虑输入格式的其它情况,就是若干个不重复的名字,用逗号分隔,最后一个是数字,表示报的指定数字X;
2、最后的数字1到100,不考虑其它情况;
3、小朋友最多100个,最少1个,每个名字不超过32字符;

 

 
知识点:  
题目来源:  内部整理 
练习阶段:  中级 
运行时间限制: 无限制
内存限制: 无限制
输入:  

 

 
输出:  

 

 
样例输入:
Marry,Jimmy,Tom,Susan,Liming,WangWu,Chen,Qian,3
                   
样例输出:
Tom,WangWu,Marry,Liming,Jimmy,Qian,Susan,Chen
                    
答案提示:

 


</pre><pre name="code" class="java">import java.util.Scanner;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int flag=0;//控制输出的逗号,报数为1时,逗号有问题
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);// 接收控制台输入的信息
		String str = scan.next();
		String[] mystr = str.split(",");
		String[] arr = new String[mystr.length-1];
		for(int i=0;i<arr.length;i++)
		{
			arr[i]=mystr[i];
		}
		
		
		final int M =Integer.valueOf(mystr[mystr.length-1]),N=arr.length;//M指定数,N为小孩个数
		int a[] = new int[N];
		int n=0,sum = 0;//n与M搭配,sum为被T出小孩的个数
		for(int i =0;sum<N-1;i++)
		{
			if(i>N-1)
				i=0;
			while(a[i] ==10)
			{
				i++;
				if(i>N-1)
					i=0;
			}
			while(a[i]!=10)
			{
				n++;
				if(n==M)
				{
					sum++;
					n=0;
					a[i]=10;//若被kill 令a[i]=10标记
					if(flag==0)
					{
						System.out.print(arr[i]);
						flag=1;
					}
					else
						System.out.print(","+arr[i]);
				}
				i++;
				if(i>N-1)
					i=0;
			}		
		}
		for(int i=0;i<N;i++)
		{
			if(a[i]!=10)
			{
//				System.out.println("the winner is "+i);
				if(flag==1)
					System.out.println(","+arr[i]);
				else
					System.out.println(arr[i]);
			}
		}
	}

}


就是约瑟夫环!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值