约瑟夫问题

Description

n个人想玩残酷的死亡游戏,游戏规则如下:

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。

Input

输入n和m值。

Output

输出胜利者的编号。

Sample

Input 

5 3

Output 

4

Hint

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
} set;

set *creat(set *tail,set *head)
{
    set *p = (set *)malloc(sizeof(set));
    p->next = head->next;//尾部结点和第一个结点连接
    tail->next = p;//把前面的和新加入的连起来
    return p;
}
//void Printf(set *head)
//{
//    set *p = head->next;
//    while(p)
//    {
//        if(p->next==NULL)
//            printf("%d\n",p->data);
//        else
//            printf("%d ",p->data);
//        p = p->next;
//    }
//}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int i = 0;
    set *head = (set*)malloc(sizeof(set));
    head->next = head;
    set *tail = head->next;
    if(n==1)
        printf("1\n");
    else
    {
        set *p,*q;
        for(i=1; i<=n; i++)
        {
            p = creat(tail,head);
            p->data = i;
            tail = p;
        }
        p = head;
        q = head->next;
        int count = 1;
        while(q->next!=q)
        {
            if(count%m==0)
            {
                p->next = q->next;
                q = q->next;
                count = 1;
            }
            else
            {
                p = p->next;
                q = q->next;
                count++;
            }
        }
        printf("%d\n",q->data);
    }
    return 0;
}

 

posted @ 2020-06-07 12:57  爱写程序的机械师  阅读(106)  评论(0)    收藏  举报