/**
* 先把人的编号存储在一数组里面,然后找到第一个开始报数的人,然后把第一个报数的人利用数组排序把他掉到前面去,然后开始报数,
* 在把报到特定数的后面的元素往前移一位,一直到把所有的数储存到另外一个数组。 可以用各种语言写,只要原理对了就行!
*/
public class JSF {
public static void main(String[] args) {
while (true) {
System.out.println("请输入总数:输入0结束");
Scanner sca = new Scanner(System.in);
int m = sca.nextInt();
if (m == 0) {
System.out.println("结束");
System.exit(0);
}
System.out.print("请输入报数周期:\n");
int n = sca.nextInt();
System.out.print("按出圈的次序输出序号:\n");
int[] a = new int[m];
int len = m;
for (int i = 0; i < a.length; i++)
a[i] = i + 1;
// i为元素下标
int i = 0;
// j代表当前要报的数
int j = 1;
while (len > 0) {
// 以m为周期的一个循环,在数组中按m周期不停报数
int t = i % m;
if (a[t] > 0) {
int w = j % n;
if (w == 0) {// 找到要出圈的人,并把圈中人数减一
System.out.print(a[t] + " ");
a[t] = -1;
j = 1;
i++;
len--;
} else {
i++;
j++;
}
} else {// 遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}
}
System.out.println();
}
}
}作者: 黑马高明辉 时间: 2012-7-20 23:50