约瑟夫环

来源:互联网 发布:matlab转置矩阵运算 编辑:程序博客网 时间:2024/06/11 08:45

约瑟夫环

约瑟夫问题
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

Problem Description

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

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

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

Input

输入n和m值。

Output

输出胜利者的编号。

Example Input

5 3

Example Output

4

Hint

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀

代码块

#include<stdio.h>#include<iostream>#include<algorithm>#include<stdlib.h>using namespace std;typedef struct node{    int data;    struct node * next;}node;node *creat(int n) //建立循环链表{    node *head,*tail,*p;    int i;    p=(node *)malloc(sizeof(node));    p->next=NULL;    head=p;    tail=p;     p->data=1;    for(i=2;i<=n;i++)    {        p=(node *)malloc(sizeof(node));        p->next=NULL;        p->data=i;        tail->next=p;        tail=p;    }    tail->next=head;    return head;}void search(node *head,int n,int m){    node *q,*p;   int num=0;   int count=0;   q=head;   while(q->next!=head)     q=q->next;   while(count<n-1)   {      p=q->next;      num++;      if(num%m==0)      {          q->next=p->next;          free(p);          count++;      }      else          q=p;   }   printf("%d\n",q->data);}int main(){     node * head;    int n,m;    scanf("%d %d",&n,&m);    head=creat(n);    search(head,n,m);}
原创粉丝点击