试题编号: | 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); } }