描述: | 有若干小朋友,站成一个圈;老师要求从第一个小朋友开始从1开始报数,报到指定数X的小朋友出圈,剩下的小朋友从出圈的小朋友的下一个开始继续报数;直到圈子中的所有小朋友都出圈为止。 现假设输入小朋友的名字和报的数X,输出小朋友出圈的顺序; 例如: 注:
|
知识点: | |
题目来源: | 内部整理 |
练习阶段: | 中级 |
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: |
|
输出: |
|
样例输入: | 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]);
}
}
}
}
就是约瑟夫环!