美文网首页
约瑟夫问题

约瑟夫问题

作者: 眼若繁星丶 | 来源:发表于2020-11-20 23:08 被阅读0次

约瑟夫问题

一、数组解法

#include <stdlib.h>
#include <stdio.h>

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    int a[n+1], visit[n+1];
    int count = 0, curIdx = 0, num = 0;

    for (int i = 1; i <= n; i++) {
        a[i] = i;
        visit[i] = 1;
    }
    while (count < n - 1) {
        for (int i = 1; i <= n; i++) {
            if (visit[i]) {
                num++;
                if (num == m) {
                    printf("%d ", i);
                    count++;
                    visit[i] = 0;
                    num = 0;
                }
                if (count == n - 1) break;
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        if (visit[i] == 1) {
            printf("\nThe last one is : %d\n", a[i]);
            break;
        }
    }

    return 0;
}

二、循环队列

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cnt = 1;
        int n = sc.nextInt(), m = sc.nextInt();
        Deque<Integer> queue = new ArrayDeque<Integer>();

        for (int i = 1; i <= n; i++) queue.offer(i);

        while (!queue.isEmpty()) {
            if (cnt == m) {
                System.out.print(queue.poll() + " ");
                cnt = 1;
            } else {
                int temp = queue.poll();
                queue.offer(temp);
                cnt++;
            }
        }
        System.out.println();
    }
}

三、数学解法

#include <stdio.h>
int main() {
    int n, m, i, s = 0;
    printf ("N M = ");
    scanf("%d%d", &n, &m);
    for (i = 2; i <= n; i++) {
        s = (s + m) % i;
    }
    printf ("The winner is %d\n", s+1);
}

相关文章

  • 约瑟夫问题

    今天看了一下约瑟夫问题,嗯,感觉自己智商欠费:( 还是来总结下好啦~ 问题 约瑟夫是犹太军队的一个将军,在反...

  • 约瑟夫问题

    题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下...

  • 约瑟夫问题

    要是你怎么制定游戏规则? 现在有前面15个好人和后面15个坏人,他们围成一圈。现在从第一个好人开始,数到第n个人就...

  • 约瑟夫问题

    问题来源 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephu...

  • 约瑟夫问题

    源文件josephus.c

  • 约瑟夫问题

    约瑟夫问题 一、数组解法 二、循环队列 三、数学解法

  • 约瑟夫问题

    一、约瑟夫问题介绍 1、约瑟夫问题原题:n个小孩子手拉手围成一个圈,编号为k(1 <= k <= n )的人从1开...

  • 约瑟夫问题

    找到首节点、创建一个节点记录遍历当前节点的前一个节点、创建一个计数器,当计数器的值为3的时候,将该节点从链表中移除...

  • 约瑟夫问题

    大家自行百度下约瑟夫问题,这里用golang+单向循环链表的方式解决约瑟夫问题,下面先提供一下代码: func (...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

网友评论

      本文标题:约瑟夫问题

      本文链接:https://www.haomeiwen.com/subject/gbzjiktx.html