Fork me on GitHub

约瑟夫环

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;
}


posted @ 2012-04-03 15:52  浪飞-louffy  阅读(152)  评论(0编辑  收藏  举报