站外题求调(玄关)
查看原帖
站外题求调(玄关)
1331835
Jason20110704楼主2024/7/30 08:36

题目传送门

描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0

输出 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

样例输入

6 2
12 4
8 3
0 0

样例输出

5
1
7

蒟蒻的代码

#include<bits/stdc++.h>
using namespace std;
struct node {
    int data;
    node *next;
};
node *head, *p, *r, *d;
int main() {
    int n, m;
    while(scanf("%d %d", &n, &m), n != 0 && m != 0) {
        head = new node;
        head->data = 1;
        head->next = NULL;
        r = head;
        for(int i = 2; i <= n; i++) {
            p = new node;
            p->next = NULL;
            p->data = i;
            r->next = p;
            r = p;
        }
        r->next = head;
        r = head;
        for(int i = 1; i < n; i++) {
            for(int j = 2; j <= m - 1; j++)
                r = r->next;
            d = r->next;
            r->next = r->next->next;
            r = r->next;
            delete d;
        }
        printf("%d\n", r->data);
        delete r;
    }
    return 0;
}
2024/7/30 08:36
加载中...