5-28 猴子选大王 (20分)

来源:互联网 发布:淘宝直通车关键词价格 编辑:程序博客网 时间:2024/05/16 03:24

5-28 猴子选大王   (20分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(\le1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

思路:

这道题主要是考约瑟夫环路问题,因为用模拟的办法时间复杂度会很高,所以有

递推公式
f[1]=0;
f[i]=(f[i-1]+m) mod i; (i>1)
有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。因为实际生活中编号总是从1开始,我们输出f[n]+1。

代码:

import java.util.Scanner;/* * 约瑟夫环路问题 */public class Main {public static int f(int a){//从0开始的if(a == 1)return 0;else return (f(a-1)+3)%a;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();System.out.println(f(a)+1);//结果要加一}}