试题编号: | 201712-2 |
试题名称: | 游戏 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
有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。
|
问题分析:采用面向对象的思想,模拟循环报数并判断即可。
程序说明:可以使用循环队列这一数据结构,本例用比较简单的方法实现同样的效果。
提交后得100分的Java语言程序如下:
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
int n, k, left, m = 1;// m表示报的数字,依次递增
ArrayList<Stu> stus = new ArrayList<>();
public static void main(String[] args) {
new Main().run();
}
public void run() {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
left = n;
k = sc.nextInt();
for (int i = 0; i < n; i++) {
Stu s = new Stu(i + 1);
stus.add(s);
}
for (int i = 0; i < stus.size(); i++) {
Stu s = stus.get(i);
s.count(m++, k);
if (s.out) {
stus.remove(s);
left--;
i--;
}
if (left == 1) {// 只剩一人
System.out.println(stus.get(0).num);
break;
}
if (i == stus.size() - 1) {// 循环
i = -1;
continue;
}
}
sc.close();
return;
}
}
class Stu {
int num;
boolean out;// 是否淘汰
public Stu(int n) {
num = n;
}
/**
* 报数
*
* @param n
* 要报的数
* @param k
* 要对比处理的数
*/
public void count(int n, int k) {
if (n % k == 0 || n % 10 == k) {
out = true;
}
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Stu) {
Stu s = (Stu) obj;
return (num == s.num);
}
return super.equals(obj);
}
}