约瑟夫问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Sample Input
5 3
Sample Output
4
Hint
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int num;
struct node *next;
};
struct node *kk(int a)
{
int b;
struct node *head,*p,*t;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
t=head;
for(b=1;b<=a;b++)
{
p=(struct node *)malloc(sizeof(struct node));
p->num=b;
p->next=NULL;
t->next=p;
t=p;
}
p->next=head->next;
return head;
};
struct node *zz(struct node *head,int a,int c)
{
int b,d=0;
struct node *p,*q;
p=head;
for(b=0;b<a;b++)
{
p=p->next;
}
q=head->next;
while(a!=1)
{
d++;
if(d%c==0)
{
p->next=q->next;
free(q);
q=p;
a--;
}
p=q;
q=q->next;
}
return p;
};
int main()
{
int a,b;
struct node *c,*d;
scanf("%d %d",&a,&b);
c=kk(a);
d=zz(c,a,b);
printf("%d\n",d->num);
return 0;
}