1073 约瑟夫环

1073 约瑟夫环

基准时间限制:秒 空间限制:131072 KB 

N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。

例如:N = 3K = 22号先出列,然后是1号,最后剩下的是3号。

Input

2个数NK,表示N个人,数到K出列。(2 <= N, K <= 10^6)

Output

最后剩下的人的编号

Input示例

3 2

Output示例

3

import java.util.Scanner;
public class Main {
    static int fun(int m,int k,int i){
        
        if(i==1)
            return (m+k-1)%m;
        else
            return (fun(m-1,k,i-1)+k)%m;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int k=sc.nextInt();
            System.out.println(fun(m,k,m)+1);
        }
        sc.close();

    }

}

f(m,k,i)m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果

i=1时,  f(m,k,i) = (m+k-1)%m

i!=1时,  f(m,k,i)= ( f(m-1,k,i-1)+k )%m

---------------------------------------------------------------------------------------------------------------------

解法2

----------------------------------------

package 约瑟夫环的数学优化方法;

import java.util.Scanner;
/*
 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
 */

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n,m,i,s=0;
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(i=2;i<=n;i++){
            s=(s+m)%i;
        }
        System.out.println(s+1);

    }

}
原文地址:https://www.cnblogs.com/watchfree/p/5350741.html