原文题目
输入输出要求
样例
题目大意
题目描述 n(n<20)个人站成一圈,逆时针编号为 1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(两个官员有可能能停在同一个人上)。接下来被官员选中的1个或2个人离开队伍。
输入格式 输入n ,k ,m ,可能有多组数据,以 0 0 0结尾。
输出格式 输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。输出的每个数应正好占3列。样例中的“ ␣ ”代表一个空格。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int n = sc.nextInt(), k = sc.nextInt(), m = sc.nextInt();
if(n==0&&k==0&&m==0)
break;
int[] num1 = new int[n + 1];
for (int i = 1; i <= n; i++) {
num1[i] = i;
}
int l = n;
int p1 = n, p2 = 1;
while (l > 0) {
int a = k, b = m;
while (a-- > 0) {
do {
p1 = (p1 + 1 + n-1) % n + 1;
} while (num1[p1] == 0);
}
while (b-- > 0) {
do {
p2 = (p2 - 1 + n-1) % n + 1;
} while (num1[p2] == 0);
}
System.out.printf("%3d", p1);
l--;
if (p2 != p1) {
System.out.printf("%3d", p2);
l--;
}
num1[p1] = num1[p2] = 0;
if (l != 0)
System.out.print(",");
}
System.out.println();
}
}
}