蓝桥杯 2018 约瑟夫环

标题:约瑟夫环

n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。

本题目就是已知 n,k 的情况下,求最后剩下的人的编号。

题目的输入是一行,2个空格分开的整数n, k
要求输出一个整数,表示最后剩下的人的编号。

约定:0 < n,k < 1百万

例如输入:
10 3

程序应该输出:
4

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

引用公式即可.

import java.util.Scanner;

/***
 * @Author: Mr.shen
 * @Date: 2019/5/8 11:28
 */
public class 约瑟夫环 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), k = in.nextInt();
        int p = 0;
        for (int i = 2; i <= n; i++) {
            p = (p + k) % i;
        }
        System.out.println(p + 1);
        //        List list = new ArrayList();
//        for (int i = 1; i <= n; i++) {
//            list.add(i);
//        }
//        int i = 0;
//        int ans = 1;
//        while (list.size() > 1) {
//            if (ans == k) {
//                list.remove(i);
//                ans = 1;
//            } else {
//                i++;
//                ans++;
//            }
//            if (i >= list.size()) i = 0;
//        }
//        System.out.println(list.get(0));
    }
}

普通方法会超时.


版权声明:本文为weixin_43835482原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。