问题描述
有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。 游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。 例如,当n=5, k=2时: 1号小朋友报数1; 2号小朋友报数2淘汰; 3号小朋友报数3; 4号小朋友报数4淘汰; 5号小朋友报数5; 1号小朋友报数6淘汰; 3号小朋友报数7; 5号小朋友报数8淘汰; 3号小朋友获胜。 给定n和k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数n和k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
题目比较简单,详细注释写在代码里了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numpeople = scanner.nextInt();
int k = scanner.nextInt();
int arr[] = new int[numpeople + 1]; //从1开始计数所以多开辟一个数组
for (int i = 1; i < numpeople + 1; i++) {
arr[i] = i;
}
boolean flag = true; //是否是只剩下一个
int numberoff = 1; //报数的数字
while (flag) { //如果不是最后一个同学那就继续报数
int globletemp = 0; //用来退出大循环
for (int i = 1; i < numpeople + 1; i++) {
if (arr[i] == -1) {
continue; //如果是已经淘汰的同学则跳过
}
int temp = 0;
for (int j = 1; j < numpeople + 1; j++) {
if (arr[j] == -1) {
temp++; //看有多少人被淘汰
}
}
globletemp = temp;
if (temp == numpeople - 1) { //如果淘汰的人等于总人数-1那代表只剩下一人
flag = false;
break;
}
if (numberoff % k == 0 || numberoff % 10 == k) { //用mod和mod10来看是否是倍数和个数位
arr[i] = -1; //如果符合的话就淘汰
}
numberoff++; //报数+1
}
if (globletemp == numpeople - 1) {
for (int i = 1; i <= numpeople; i++) {
if (arr[i] != -1) {
System.out.println(arr[i]); //如果是-1就跳过,不是的话就打印
}
}
break;
}
}
}
}