求助,一道很简单的java/C编程题,想了很久还没有解决

如题

            二战后的某一天,N个日本人来到了一个山洞休息,为了派出一个日本人去外面充满危险的丛林中采摘食物,他们设置如下游戏产生外出采摘的人: 

1、首先,所有参加游戏的日本人按顺序编号为1、2、3…N;
2、接下来每个日本人心里产生一个数字,这个数字称为序号为 N的人的密码P;
3、所有参加游戏的人按照编号站成一个圈,长老为游戏设置初始密码K,从编号为 1的人开始报数,报到 K的人退出队伍,然后将自己心中的密码P说出来,由下一个人继续从 1开始报数,报到P的人退出队伍,以此类推;
4、当队伍中剩下一个人的时候,这个人就是今天要出去采摘的日本人,他可能回不来了!
请各位同学设计程序并使用Java语言实现改程序,在用户输入了人数N、每个人的密码P和初始密码K的情况下,自动完成上面的选择过程,输出先后离开队伍的人的序号序列,最后输出要去采摘的日本人,输出他的编号。

用java或者c都可以,表明解题步骤就行
谢谢各位大佬

0

2个回答

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class JosephCircle {

    public int newJoseph(int n, int[] p, int k) {
        List<Integer> num = new ArrayList<Integer>();
        for( int i = 0; i < n; i++ ) num.add(i);

        int t = k, index = 0;
        for( int i = 0; i < n - 1; i++ ) {
            index = ( index + t ) % num.size();
            num.remove(index);
            t = p[index];
            if(index == num.size()) index=0;
        }
        return num.get(0)+1;
    }

    public int oldJoseph(int n, int k){
        int w = 0;
        for( int i = 2; i <= n; i++ ){
            w = (w+k)%i;
        }
        return w;
    }

    public static void main(String[] args) {
        JosephCircle jc = new JosephCircle();
        Scanner scan = new Scanner(System.in);

        int n,k;
        int[] p = new int[100];
        System.out.print("Enter N = ");n = scan.nextInt();
        System.out.print("Enter P[] = ");
        for(int i = 0; i < n; i++){
            p[i] = scan.nextInt();
        }
        System.out.print("Enter K = ");k = scan.nextInt();
        System.out.println();
        System.out.println("Survivor is No." + jc.newJoseph(n,p,k));
    }
}

1
qq_18404993
Zijeak 好的,谢谢,问题已解决,非常感谢大佬相助
10 个月之前 回复

不管是日本人还是二战,这些都是废话,这无非就是一个约瑟夫环问题

只要你知道这是什么问题,自己google下就可以了。

https://www.cnblogs.com/cmmdc/p/7216726.html
https://blog.csdn.net/qq_21150865/article/details/60467166

1
qq_18404993
Zijeak 好的,谢谢,问题已解决
10 个月之前 回复
JonathanYan
JonathanYan 回复: 我认为就是数组模拟,公式法不适用,如果你有更好的方法我也很想学习
11 个月之前 回复
JonathanYan
JonathanYan 说错了,这题可能还真得用模拟来做,公式法是从底向上求的,默认每一次的筛选值M固定,而这题里需要在每一次判断哪个人的初始下标再获取密码p。,
11 个月之前 回复
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 回复: 难道不能举一反三么。起码你应该先自己试试,本来就是思考题,目的就是给你练习的,我又不需要练习。
11 个月之前 回复
JonathanYan
JonathanYan 老哥,读题谢谢,这是约瑟夫环的变种,每次筛掉的人的id是不一样的。虽然可以将你链接的算法简单改改就能解决,但麻烦您读题
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!