约瑟夫环
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; }