约瑟夫问题

约瑟夫问题

 

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

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

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

输入

输入n和m值。

输出

输出胜利者的编号。

示例输入

5 3

示例输出

4

提示

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
    int data;
    struct node *next;
}*A,B;
A head,p,q;
int main()
{
    int n,m,i,j,k;
    int num[1002];

    while(scanf("%d%d",&n,&m) !=EOF)
    {
        p=(A)malloc(sizeof(B));
        p->data=1;
        head=p;
        memset(num,0,sizeof(num));
        for(i=1; i<n; i++)
        {
            q=(A)malloc(sizeof(B));
            q->data=i+1;
            q->next=NULL;
            p->next=q;
            p=q;
        }
        p->next=head;
        q=head;
        int count=0;
        j=0;
        k=1;
        while(count<n)
        {
            p=q->next;
            k++;
            if(k%m==0)
            {
                q->next=p->next;
                num[j++] = p->data;
                free(p);
                count++;
            }
            else
                q=p;
        }
        printf("%d\n",num[j-1]);
    }
    return 0;
}

 

posted @ 2014-08-13 23:13  夏迩  阅读(117)  评论(0)    收藏  举报