约瑟夫环
1,循环链表方法
建立一个具有n个链结点,无头结点的循环链表;
确定第1个报数人的位置; 不断地从链表中删除链结点,直到链表为1结点。2,数组模拟,出去的置0
3,数学方法,只能输出最后的
代码
1
/*
1,构建循环链表
l为为结点
p为头结点
p=l-》next;
2,循环删除,直到剩下最后一个结点
while(p-》next=p)
删除s,p-》next=s
p-》next=s-》next;
free(s);
s=p-》next;
*/
#include<stdio.h>
#define N 3
struct node{
int a;
struct node *next;
};
int main()
{
struct node *l,*p,*q,*s,*o;
int i=0;
p=l=(struct node *)malloc(sizeof(struct node));
l->a=(++i);
while(i<10)
{
l->next=(struct node *)malloc(sizeof(struct node));
l=l->next;
l->a=(++i);
l->next=NULL;
}
l->next=p;
q=p;
do
{
printf("%d ",q->a);
q=q->next;
}while(q!=l->next);
printf("\n");
q=l;
s=p;
while(q->next!=q)
{
for(i=0;i<N-1;i++)
{
q=q->next;
s=s->next;
}
printf("%d ",s->a);
q->next=s->next;
free(s);
s=q->next;
}
printf("%d ",q->a);
return 0;
}2
#include<stdio.h>
#define M 10
#define N 3
int main()
{
int i=0,count,k;
int a[M];
while(i++<M)a[i-1]=i;
i=0;
while(i++<M)printf("%d ",a[i-1]);
printf("\n");
i=0;
for(count=1;count<=10;count++)
{
for(k=1;k<=N; )
{
if(i>M-1)i=0;//i=M-1,到头,i=0
if(a[i]!=0)k++;//a[]=0,k不加,但是i++
i++;
}
printf("%d ",a[i-1]);
a[i-1]=0;
}
return 0;
}3
#include<stdio.h>
int main()
{
int n=10,k=3,s=1,i;
for(i=2;i<=n;i++)
{
s=(s+k)%i;
if(s==0)s=i;
}
printf("%d",s);
return 0;
}


浙公网安备 33010602011771号