ACM:出圈

题目描述

设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。

输入

输入多行,每行2个数,分别表示n和m.

输出

计算每一行中最后剩下这个人的编号.

样例输入

10 3

样例输出

4

答案:

import java.util.Scanner;
 
 
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            F(sc.nextInt(), sc.nextInt());
        }
        sc.close();
    }
     
    private static void F(int n, int m){
        //构建循环链表
        Node head = new Node(null, null);
        head.next = head;
        Node p = head;
        for(int i = 1; i <= n; i++){
            p.next = new Node(i, p.next);
            p = p.next;
        }
         
        // count代表当前数的数字
        int count = 0; 
        p = head;
        while(head.next.next != head){
            if(p.next == head)
                p = head;
             
            count++; //开始报数
            if(count % m == 0){ //报数到第个m人
                //System.out.println(p.next.data);
                p.next = p.next.next; //该人出圈
            }else{
                p = p.next; //往下继续循环到只剩一个人
            }
        }
        System.out.println(head.next.data);
    }
     
    //链表节点类
    private static class Node{
        private Integer data;
        private Node next;
         
        public Node(Integer data, Node next){
            this.data = data;
            this.next = next;
        }
    }
     
}

 

你可能感兴趣的:(算法编程)